为什么这个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)
答案 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)
知道哪里出错了。