我正在学习一般树和二叉树数据结构,使用Python作为学习媒介。
我看到二叉树类一般有三个属性,它的值,左 child 和右 child 。一旦做出此设计选择,就不需要任何更改。
然而,一般树可以有任意数量的子树,范围是 0 到无穷大。所以我很好奇,如何创建可变数量的子级(例如 child_1
...child_500
)?
我是否以错误的方式思考这个问题?也许每棵树都应该有一个 child 属性,它是一个值列表或一个字典,其中键是名称 child_1...child_500,值是它们的 child ..?
最佳答案
正如其他人所指出的,不同数量的命名属性会变得难以处理。列一份 list 是个好主意。就我个人而言,我建议采用链表架构。
定义一个 GeneralTreeNode 类,并将属性定义为 value、parent、child、left_sib 和 right_sib。您可以将最左边的 sibling 视为“第一个出生的”(这是因为它将被引用为其父节点的唯一子节点。可以通过从最左边的 sibling 开始遍历来访问所有其他 sibling 。
这个小例子展示了如何创建这样一个类,设置节点之间的值和关系,以及从根遍历到小型三节点树的最右边的子节点。
希望这有帮助!
class GeneralTreeNode():
def __init__(self,value=None,parent=None,child=None,left_sib=None,right_sib=None):
self.value = value
self.parent = parent
self.child = child
self.left_sib = left_sib
self.right_sib = right_sib
def get_value(self):
return self.value
def get_parent(self):
return self.parent
def get_child(self):
return self.child
def get_left(self):
return self.left_sib
def get_right(self):
return self.right_sib
def set_parent(self,parent):
self.parent = parent
def set_child(self,child):
self.child = child
def set_left(self,left_sib):
self.left_sib = left_sib
def set_right(self,right_sib):
self.right_sib = right_sib
a1 = GeneralTreeNode(value='a1')
b1 = GeneralTreeNode(value='b1')
b2 = GeneralTreeNode(value='b2')
a1.set_child(b1)
b1.set_parent(a1)
b1.set_right(b2)
b2.set_left(b1)
a1.get_child().get_right().get_value()
>>>> 'b2'
关于python - 如何迭代创建通用树的类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60122436/