2015-06-04 134 views
0

得到最小值我創建了一個二進制搜索類,但我在努力創建一個最小功能,以幫助找到一個二叉樹的最小值。如何從一個二叉搜索樹

class BinarySearchTree: 

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

    def insert(self, new_data): 
     if new_data == self.data: 
      return 
     elif new_data < self.data: 
      if self.left == None: 
       self.left = BinarySearchTree(new_data) 
      else: 
       self.left.insert(new_data) 
     else: 
      if self.right == None: 
       self.right = BinarySearchTree(new_data) 
      else: 
       self.right.insert(new_data) 

    def create_string(self,spaces): 
     info = ' ' * spaces + str(self.data) 
     if self.left != None: 
      info += '\n(l)' + self.left.create_string(spaces + 4) 
     if not self.right == None: 
      info += '\n(r)' + self.right.create_string(spaces + 4) 
     return info 

    def __str__(self): 
     representation = self.create_string(0) 
     return representation 

    def get_left(self): 
     return self.left 

    def get_right(self): 
     return self.right 

    def get_data(self): 
     return self.data 

def minimum(tree): 
    if tree.left: 
     return minimum(tree.get_left) 
    else: 
     return tree.get_left 

所以我寫了最小函數,但由於某種原因它總是返回一個Nonetype錯誤。有沒有人有一個想法如何二叉樹get_left直到有沒有更多的節點

+0

'其他:返回tree.data'應該修復它 – inspectorG4dget

+0

回報最低(tree.get_left()) – satoru

+0

它仍然會返回一個沒有類型,甚至與tree.get_left(更換後) – Matthew

回答

0

非遞歸解決方案

def minimum(tree): 
    while tree.left is not None: 
     tree = tree.left 
    return tree.data 
+0

這將是更Python寫:'while tree.left:' - part'不是None'是多餘的。儘管我已經定義 – alfasin

+0

我感到奇怪的是在CALSS「get_left()」,當我在我最低functioin就可以打電話,什麼也不顯示?或者只是一個nonetype – Matthew

+0

@Matthew當你'回報tree.get_left '或'返回最小值(tree.get_left)''你不叫'get_left'。相反,您返回函數或將其傳遞給「最小值」,而不是結果。請記住,python函數是可以從函數返回或將它們傳遞給函數的對象。 – Alik

0

如果沒有tree.left你應該返回tree

def minimum(tree): 
    if tree.left: 
     return minimum(tree.get_left) 
    else: 
     return tree 

當你在你的問題中提到,由於沒有tree.left返回tree.get_left將返回None

+0

我被卡住的事情是我在我的類中定義了get_left(),但是在我的最小函數中它似乎不起作用? – Matthew

+0

@Matthew當你調用get_left時,你應該在你的例子中使用括號:'tree.get_left()':'tree.get_left' – alfasin

0
def minimum(tree): 
    if tree.left: 
     return minimum(tree.get_left) 
    else: 
     return tree 

第一if語句檢查tree.left =無,並因此返回tree.get_left返回無。