Python实现二进制文件的预排序方法

2024-05-20 16:25:29 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么这个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)

Tags: selfrightnonenodedataifinitdef
3条回答

您的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)

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()

如果您只使用保存在__init__中的self.root,那么也不需要将root传递给CreateTree

因为您正在CreateTree函数中设置self.root.data = '*' 这个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)

知道哪里出了问题。

相关问题 更多 >