非二叉树遍历法
Nonbinary Tree Traversal Method
我正在尝试创建一个 python 非二叉树 class,其方法允许我获取特定节点,并将其他方法应用于这些找到的节点。
我从这个非常好的示例中的代码开始:https://www.youtube.com/watch?v=4r_XR9fUPhQ
我添加了一个方法,接受我要找的节点(“/”分隔,跳过根)对应的字符串,递归搜索树,理论上,returns使用“self”的节点,因此我可以在其上应用另一种方法。
但是,当我 return(self) 时,它返回给我一个非类型而不是节点。
关于如何解决这个问题的建议,或者如果这是一种糟糕的结构方式,我们将不胜感激!
提前致谢。
注意:到目前为止,这只是设置为在叶子上进行匹配,但如果我能把该死的东西送到 return 我想要的节点,我可以解决这个问题。
代码如下:
class TreeNode:
def __init__(self, data):
self.data = data
self.children = []
self.parent = None
self.forecast = None
def get_level(self):
level = 0
p = self.parent
while p:
level += 1
p = p.parent
return level
def print_tree(self):
spaces = ' ' * self.get_level() * 3
prefix = spaces + "|__" if self.parent else ""
print(prefix + self.data)
if self.children:
for child in self.children:
child.print_tree()
def get_node(self, path):
segs = path.split('/')
sep = "/"
print(self.return_child_names())
if self.children:
for child in self.return_child_names():
if segs[0] == child:
found_child = segs.pop(0)
break
self.children[self.return_child_names().index(found_child)].get_node(sep.join(segs))
else:
print("Found the node!")
print(self)
print(self.data)
return(self)
def return_child_names(self):
return([c.data for c in self.children])
def add_child(self, child):
child.parent = self
self.children.append(child)
def build_product_tree():
root = TreeNode("Electronics")
laptop = TreeNode("Laptop")
laptop.add_child(TreeNode("Mac"))
laptop.add_child(TreeNode("Surface"))
laptop.add_child(TreeNode("Thinkpad"))
cellphone = TreeNode("Cell Phone")
cellphone.add_child(TreeNode("iPhone"))
cellphone.add_child(TreeNode("Google Pixel"))
cellphone.add_child(TreeNode("Vivo"))
tv = TreeNode("TV")
tv.add_child(TreeNode("Samsung"))
tv.add_child(TreeNode("LG"))
root.add_child(laptop)
root.add_child(cellphone)
root.add_child(tv)
root.print_tree()
return(root)
product_tree = build_product_tree()
product_tree.get_node("Laptop/Mac").print_tree()
问题出在函数 get_node
中:您并非 总是 return 值。值得注意的是,在下面的块中没有 return
,因此函数可以 return None
:
if self.children:
for child in self.return_child_names():
if segs[0] == child:
found_child = segs.pop(0)
break
self.children[self.return_child_names().index(found_child)].get_node(sep.join(segs))
您从对 get_node
的递归调用中获得的值被忽略。你实际上应该 return 它:
return self.children[self.return_child_names().index(found_child)].get_node(sep.join(segs))
我正在尝试创建一个 python 非二叉树 class,其方法允许我获取特定节点,并将其他方法应用于这些找到的节点。
我从这个非常好的示例中的代码开始:https://www.youtube.com/watch?v=4r_XR9fUPhQ
我添加了一个方法,接受我要找的节点(“/”分隔,跳过根)对应的字符串,递归搜索树,理论上,returns使用“self”的节点,因此我可以在其上应用另一种方法。
但是,当我 return(self) 时,它返回给我一个非类型而不是节点。
关于如何解决这个问题的建议,或者如果这是一种糟糕的结构方式,我们将不胜感激!
提前致谢。
注意:到目前为止,这只是设置为在叶子上进行匹配,但如果我能把该死的东西送到 return 我想要的节点,我可以解决这个问题。
代码如下:
class TreeNode:
def __init__(self, data):
self.data = data
self.children = []
self.parent = None
self.forecast = None
def get_level(self):
level = 0
p = self.parent
while p:
level += 1
p = p.parent
return level
def print_tree(self):
spaces = ' ' * self.get_level() * 3
prefix = spaces + "|__" if self.parent else ""
print(prefix + self.data)
if self.children:
for child in self.children:
child.print_tree()
def get_node(self, path):
segs = path.split('/')
sep = "/"
print(self.return_child_names())
if self.children:
for child in self.return_child_names():
if segs[0] == child:
found_child = segs.pop(0)
break
self.children[self.return_child_names().index(found_child)].get_node(sep.join(segs))
else:
print("Found the node!")
print(self)
print(self.data)
return(self)
def return_child_names(self):
return([c.data for c in self.children])
def add_child(self, child):
child.parent = self
self.children.append(child)
def build_product_tree():
root = TreeNode("Electronics")
laptop = TreeNode("Laptop")
laptop.add_child(TreeNode("Mac"))
laptop.add_child(TreeNode("Surface"))
laptop.add_child(TreeNode("Thinkpad"))
cellphone = TreeNode("Cell Phone")
cellphone.add_child(TreeNode("iPhone"))
cellphone.add_child(TreeNode("Google Pixel"))
cellphone.add_child(TreeNode("Vivo"))
tv = TreeNode("TV")
tv.add_child(TreeNode("Samsung"))
tv.add_child(TreeNode("LG"))
root.add_child(laptop)
root.add_child(cellphone)
root.add_child(tv)
root.print_tree()
return(root)
product_tree = build_product_tree()
product_tree.get_node("Laptop/Mac").print_tree()
问题出在函数 get_node
中:您并非 总是 return 值。值得注意的是,在下面的块中没有 return
,因此函数可以 return None
:
if self.children:
for child in self.return_child_names():
if segs[0] == child:
found_child = segs.pop(0)
break
self.children[self.return_child_names().index(found_child)].get_node(sep.join(segs))
您从对 get_node
的递归调用中获得的值被忽略。你实际上应该 return 它:
return self.children[self.return_child_names().index(found_child)].get_node(sep.join(segs))