[英]Print a binary tree, python, in inorder
我和我的朋友正在用Python 3.1进行一些功课,非常困。 我们正在编程一个二叉树,它的工作正常,除了当我们想要以一种能够创建句子的方式(所有单词按顺序依次排列)顺序打印所有节点时。 我们一直在互联网上寻找有关如何进行的线索,并且我们已经花了两个小时研究这个小东西。 任何建议/帮助都会很棒。
我们的程序/二叉树:
class Treenode:
def __init__(self, it = None, le = None, ri = None):
self.item = it
self.left = le
self.right = ri
class Bintree:
def __init__(self):
self.item = None
self.left = None
self.right = None
def put(self, it = None):
key = Treenode(it)
if self.item == None:
self.item = key
return
p = self.item
while True:
if key.item < p.item:
if p.left == None:
p.left = key
return
else:
p = p.left
elif key.item > p.item:
if p.right == None:
p.right = key
return
else:
p = p.right
else:
return
def exists(self, it):
key = it
p = self.item
if p == key:
return True
while True:
if key < p.item:
if p.left == None:
return False
else:
p = p.left
elif key > p.item:
if p.right == None:
return False
else:
p = p.right
else:
return
def isEmpty(self):
if self.item == None:
return True
else:
return False
def printtree (Treenode):
if Treenode.left != None:
printtree (Treenode.left)
print (Treenode.item)
if Treenode.right != None:
printtree (Treenode.right)
运行程序时,我们得到一种打印结果:“ bintree.Treenode对象位于0x02774CB0”,这不是我们想要的。
我们通过运行以下命令来使用树:
import bintree
tree = bintree.Bintree()
print(tree.isEmpty()) # should give True
tree.put("solen")
print(tree.isEmpty()) # should give False
tree.put("gott")
tree.put("sin")
tree.put("hela")
tree.put("ban")
tree.put("upp")
tree.put("himlarunden")
tree.put("manen")
tree.put("seglar")
tree.put("som")
tree.put("en")
tree.put("svan")
tree.put("uti")
tree.put("midnattsstuden")
print(tree.exists("visa")) # should give False
print(tree.exists("ban")) # should give True
tree.printtree() # print sorted
另外,倒数第二行给出的结果是“ None”,而不是“ True”,这很奇怪。
print(tree.exists("visa"))
将返回None
,因为在最后一行exists()
有return
声明没有任何值(默认为None
)。
另外,您不应该为printtree
参数Treenode
命名,因为它是现有类的名称,并且可能导致混淆。 它看起来应该更像:
def printtree(tree_node):
if tree_node.left is not None:
printtree(tree_node.left)
print(tree_node.item)
if tree_node.right is not None:
printtree(tree_node.right)
另一件事是调用printtree
它是一个函数,而不是Bintree
方法,因此我想应该将其printtree(tree)
。
使测试更容易的一种方法是使用-assert()-而不是打印内容,然后再引用您的代码。
tree = Bintree()
assert(tree.isEmpty())
tree.put("solen")
assert(not tree.isEmpty())
tree.put("gott")
tree.put("sin")
tree.put("hela")
tree.put("ban")
http://docs.python.org/reference/simple_stmts.html#the-assert-statement
如果条件不成立,则会引发错误。 我知道这并不能解决您的错误,但是使事情变得不太模糊总是可以帮助调试。
要打印二叉树,如果要打印叶子,则只需打印值即可; 否则,先打印左边的孩子,然后再打印右边的孩子。
def print_tree(tree):
if tree:
print tree.value
print_tree(tree.left)
print_tree(tree.right)
您没有为printtree()指定起始条件。 您正在定义如何正确地遍历树,但是对printtree()的调用没有任何起点。 尝试设置默认检查以查看是否传入了一个参数,以及是否不是从二叉树的头节点开始的。
倒数第二行打印None的原因是,在存在的方法中,对于查找等于key的“ p.item”,您只有一个“ return”,而不是“ return True”。 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.