Python实现了二叉树的预订方法

时间:2011-08-14 09:19:40

标签: python binary-tree

为什么这个python程序无法正常运行。我想构建一个二叉树,然后按预先的顺序遍历它。当我调用PreOrder方法时,它什么都不返回。

class Node:
    def __init__(self, data=None, left=None, right=None):
        self.left = left
        self.right = right
        self.data = data

class BTree:
    def __init__(self, root):
        self.root = root

    def CreateTree(self, root):
        self.root.data = raw_input("Enter data,'*' means empty: ")
        if self.root.data == '*':
            return
        self.root.left = Node()
        self.root.right = Node()
        self.CreateTree(self.root.left)
        self.CreateTree(self.root.right)

    def PreOrder(self, root):
        if self.root != None:
            if self.root.data != '*':
                print self.root.data,
                PreOrder(self, self.root.left)
                PreOrder(self, self.root.right)

if __name__ == '__main__':
    t = Node()
    bt = BTree(t)
    bt.CreateTree(t)
    bt.PreOrder(t)

4 个答案:

答案 0 :(得分:3)

PreOrder是类BTree的方法,您可能希望更改递归调用,如下所示:

def PreOrder(self):
    if self.root != None:
        if self.root.data != '*':
            print self.root.data,
            self.root.left.PreOrder()
            self.root.right.PreOrder()

如果您仅使用root

中保存的CreateTree,则也无需将self.root传递给__init__

答案 1 :(得分:0)

我看一下您的CreateTree方法,您会看到,您从未使用过root,因此self.root.data始终为*。如果您解决了这个问题,您的代码会遇到更多问题,这些问题都与self和范围有关。您可能需要查看this

答案 2 :(得分:0)

您的CreateTree方法根本没有提及参数root。此方法始终在self.root上运行。

这样的事情可能有用:

def CreateTree(self, current_node):
    current_node.data = raw_input("Enter data,'*' means empty: ")
    if current_node.data == '*':
        return
    current_node.left = Node()
    current_node.right = Node()
    self.CreateTree(current_node.left)
    self.CreateTree(current_node.right)

答案 3 :(得分:0)

因为您要在self.root.data = '*'功能中设置CreateTree 这个self.root.data = raw_input("Enter data,'*' means empty: ")。要终止输入提示,您必须最后输入'*'。因此,self.root.data的最后一个值是'*'。

试试这个

    print self.root.data
    root.data = raw_input("Enter data,'*' means empty: ")
    print self.root.data
    if root.data == '*':
        return

和这个

    def CreateTree(self,root):
        print self.root.data
        root.data = raw_input("Enter data,'*' means empty: ")
        print self.root.data
        if root.data == '*':
            return
        self.root.left = Node()
        self.root.right = Node()
        self.CreateTree(self.root.left)
        self.CreateTree(self.root.right)

    def PreOrder(self, root):
        print root
        print self.root
        print self.root.data
        if self.root != None:
            if self.root.data != '*':
                print self.root.data,
                PreOrder(self, self.root.left)
                PreOrder(self, self.root.right)
            else:
                print 'what the hell'

if __name__ == '__main__':
    t = Node(10,Node(),Node())
    print t.data
    bt = BTree(t)
    bt.CreateTree(t)
    bt.PreOrder(t)

知道哪里出错了。