python - 二叉树不显示节点存在 Python
问题描述
insert
我正在尝试使用andpreorder
方法实现二叉树。
将元素添加到树后,仅显示一个元素。
有人可以让我知道我错在哪里。
下面是代码:
class Node(object):
def __init__(self, value, left=None, right=None):
self.value = value
self.left = None
self.right = None
def __repr__(self):
return '{}'.format(self.value)
class BinaryTree(object):
def __init__(self, root=None):
self.root = root
def add(self, value):
val = self.root
if not val:
self.root = value
val = value
elif not val.left:
val = value
elif not val.right:
val = value
else:
self.left = val.left.add(value)
return val
def preorder(self):
val = self.root
if not val: # this will handle the case when root node is None.
return
print(val)
if val.left:
val.left.preorder()
if val.right:
val.right.preorder()
def main():
binary_tree = BinaryTree()
print("Adding nodes to the tree")
for i in range(1, 11):
node = Node(i)
binary_tree.add(node)
print("Printing preorder...")
binary_tree.preorder()
if __name__ == '__main__':
main()
输出
Adding nodes to the tree
Printing preorder...
1
解决方案
您的代码有几个不同的错误。有些与您如何修改self.root
(或失败)有关,有些与尝试递归错误类型有关。
第一个问题,这就是您的代码静默失败的原因,与您的BinaryTree.add
方法有关,当树为空时,它什么也不做。问题是您将一个局部变量初始化val
为等于您的根节点(如果有的话),然后将其重新绑定到其他值。但这根本不会改变根值,只会改变局部val
变量。
建议大家一起去掉,直接val
读写self.root
。然后你实际上会取得一些进展,并看到其他问题。
这是一个开始:
def add(self, value):
if self.root is None:
self.root = value
elif self.root.left.left is None:
self.root.left = value
...
我提到的其他问题都是相似的,尽管一个发生BinaryTree.add
在BinaryTree.preorder
. 问题是您尝试在根节点的其中一个子节点上调用相同的方法(add
或)。preorder
但是节点是Node
实例,并且没有您在BinaryTree
类中定义的方法。
这个问题没有上一个那么明显的解决方案。一个想法可能是将方法的逻辑移到Node
类中(您可以轻松地递归),并在BinaryTree
方法中只保留空树处理代码(其他所有内容都委托给根节点)。
推荐阅读
- rest - talend tRESTClient 怀疑存在 204 No Content response without "content-length: 0" header
- c++ - 使用 graphics.h 库时,显示对象倒置并且坐标也倒置
- angular - 如何使用指令反应形式应用验证规则?
- testing - 赛普拉斯为钩子后保存值
- c++ - Bazel,带有 mingw64 编译器的 Windows 10 工具链配置
- asp.net - 如何使用窗口服务从电子邮件中下载和提取大文件
- sql-server - 数字范围差异
- bootstrap-4 - 为什么使用Bootstrap4之后,Ajax就不是一个函数了?
- ruby - 为什么我不能用整数打印字符串?
- mapr - Apache Drill 的身份验证暂时失败