2011-08-14 43 views
0

爲什麼這個python程序無法正確運行。我想構建一個二叉樹,然後按照預定順序遍歷它。當我打電話給PreOrder方法時,它什麼都不返回。Python實現二叉樹的預序方法

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) 

回答

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

你也不需要通過rootCreateTree,如果你是隻使用self.root你保存在__init__

0

我看你的CreateTree方法,你會看到,你從來沒有使用root因此self.root.data將永遠是*。如果你解決了這個問題,你的代碼會遇到更多的問題,所有的問題都與self和範圍有關。您可能需要檢查this

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

因爲你正在做 這self.root.data = raw_input("Enter data,'*' means empty: ")設置self.root.data = '*'CreateTree功能。並且要終止輸入提示,最後必須輸入'*'。所以你的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) 

知道哪裏出了問題。