簡體   English   中英

按順序打印二叉樹python

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM