按顺序打印二叉树python

时间:2011-02-17 13:31:02

标签: python printing binary-tree 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

另外,倒数第二行给出了“无”而不是“真”,这很奇怪。

4 个答案:

答案 0 :(得分:1)

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)

答案 1 :(得分:0)

使测试更容易的一种方法是使用-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

如果条件不正确,则会引发错误。我知道这不会修复你的错误但是使事情变得模糊不清总是有助于调试。

答案 2 :(得分:0)

要打印二叉树,如果要打印叶子,则只需打印该值;否则,你打印左边的孩子,然后是正确的孩子。

def print_tree(tree):
    if tree:
        print tree.value
        print_tree(tree.left)
        print_tree(tree.right)

答案 3 :(得分:0)

您没有为printtree()指定起始案例。您正在定义如何正确递归树,但是您对printtree()的调用没有任何节点可以启动。尝试设置默认检查以查看是否传入参数,以及是否未在bintree的头节点处启动。

你的倒数第二行的原因是打印None是因为,在你的exists方法中,你只是有一个“return”而不是“return True”,因为找到一个'p.item'就是等于钥匙。