2014-01-16 83 views
0

我的任務是構建一個函數,它返回給定二叉樹中「叔叔」的數目。只有當他的兄弟(他父親的第二個孩子)有孩子。 這是我的代碼: 「在二叉樹中找到「叔叔」 - Python

def uncle(root,count = None): 
    if count is None: 
     count = [0] 
    a,b = 0,0 
    if root.left: 
     if root.left.left or root.left.right: 
      a = uncle(root.left) 
      a = 1 
    if root.right: 
     if root.right.right or root.right.left: 
      b = uncle(root.right) 
      b = 1 
    if b > 0: 
     count[0] += 1 
    if a > 0: 
     count[0] += 1 
    return count[0] 

」 這是bin_tree類: 「

Class bin_tree(): 
    def __init__(self,data, left_child = None, right_child = None): 
     self.data = data 
     self.left = left_child 
     self.right = right_child 

」 我的問題是這樣的: 當我換行: A =叔叔(root.left) a = 1 它沒有工作(含義=變量a由於某種原因已將其值更改爲0),我絕對不知道爲什麼......我認爲它應該起作用,因爲 如果我首先調用函數的遞歸或首先說a = 1,那並不重要。 有人可以幫我嗎?

+0

如果你有'a = 1'後面加上'a = uncle(...)',第二行會覆蓋'a'的值。 – interjay

+0

但爲什麼?我不會返回'a'..那麼爲什麼'a'值正在改變? – user3045065

+0

因爲您正在爲其分配值。這就是'a = something'所做的。 – interjay

回答

0

我還沒有測試過,但它應該可以工作。你寫的代碼可以減少很多。

對於初學者來說,當它不是真的需要時,你可以列爲清單。

你的a和b永遠不會被使用,所以沒有必要給他們分配任何東西。這可能是你爲什麼會得到一個錯誤,無論你給a或b賦予什麼樣的價值。

然後你不需要檢查a或b是否大於1.當你發現樹中有另一個叔叔時,你可以增加計數。

然而,它不工作的主要原因是,每次你打電話給叔叔,你都沒有通過你的新計數。這意味着它將默認值設置爲None。這會導致列表重置爲[0]。實際上,一個新的列表已經被創建出來,它與前一個列表不同,即使它們具有相同的名稱。所以,雖然你可能認爲你正在更新相同的計數,但你不是。這是一個範圍問題。

def uncle(root,count=0): 
    if root.left: 
     if root.left.left or root.left.right: 
      count = uncle(root.left, count) 
      count += 1 
    if root.right: 
     if root.right.right or root.right.left: 
      count = uncle(root.right, count) 
      count += 1 
return count