2017-07-14 137 views
0

我想在二叉搜索樹上實現簡單的inorder遍歷方法。在Python中使用inorder遍歷(遞歸)打印二叉搜索樹節點

  10 
     / \ 
     5  15 
      \ 
      8 

我想打印整個樹,但我只打印前3個節點。我的問題是:

- 如何解決我的'inorder'打印方法? 'insert'方法正常工作。 - inorder方法的基本條件是什麼?如何知道在所有節點打印完後停止?

class Tree: 
    def __init__(self, value): 
    self.node = value 
    self.leftChild = None 
    self.rightChild = None 

    def insert(self, value): 
    if self.node is None: 
     self.node = value 
     return True 
    if self.node is not value: 
     if self.node > value: 
      if self.leftChild is None: 
       self.leftChild = Tree(value) 
      else: 
       return self.leftChild.insert(value) 
     if self.node < value: 
      if self.rightChild is None: 
       self.rightChild = Tree(value) 
      else: 
       return self.rightChild.insert(value) 
    else: 
     return False 

    def inorder(self): 
     if self: 
      if self.leftChild: 
       return self.leftChild.inorder() 
      print self.node 
      if self.rightChild: 
       return self.rightChild.inorder() 


tree = Tree(10) 
tree.insert(5) 
tree.insert(8) 
tree.insert(15) 
tree.inorder() 


> 5 
    8 
    10 

回答

3

return self.leftChild.inorder()return結束呼叫到inorderself之前和self.rightChild可以處理。刪除return,該方法不會返回任何內容。

+0

非常感謝!就是這樣!關於我的基本條件問題,我真的迷失在這些遞歸中。讓我這樣問:假設我們的樹只有4個節點:根是10:10的左邊的孩子是5:10的右邊的孩子是15:5的右邊的孩子是8. Inorder()將以Root開始並調用self。 leftChild.inorder(),它是'5'。現在,節點'5'將再次調用self.leftChild.inorder(),但由於它沒有離開子節點,所以會執行'print self.node'。接下來,它會調用self.rightChild.inorder(),它會將其引導爲8.由於8沒有正確的子節點,它將執行'print self.node'。 – Batool

+0

問題:從節點8,inorder()如何知道它應該一直回到10?它將如何知道所有節點何時被訪問? – Batool

+0

「節點'5'將調用self.leftChild.inorder()」不,如果self.leftChild'意味着它甚至不會嘗試。順便說一句,如果「自我」沒有意義,請刪除它。對你的問題:遞歸不是魔術,它只是函數調用。當一個函數調用完成時,調用該函數的函數將繼續它停止的地方。 Python會跟蹤堆棧中幀中的所有函數調用。我建議單步調試。 [這是一個簡單的](http://www.pythontutor.com/)。它不知道如何做任何你沒有看到或不熟悉的事情。這只是做你告訴它。 –