2013-10-16 38 views
1

我需要通過檢查節點的分支總和是否大於零來搜索樹。然而,我遇到了總和問題 - 我得到一個類型錯誤(int對象不可調用)在在高分搜索樹時出錯

branch_sum = [t[0] for t in current] 

行。我認爲這是因爲最終我會得到一個單一的節點

current = [[1,'b']] 

(例如),所以我添加了if/else語句。即我以爲我試圖總結一下看起來像這樣的東西:

first = [1] 

但是,問題仍然存在。我不確定可能會造成這種情況。

作爲參考,current是列表的列表,第一個插槽是節點數據,第二個插槽是節點id(位於內部列表中)。 group()函數根據子節點的id將節點上的數據分組在一個節點上(左側的子節點的ID爲1,右側的ID爲0)。

樹我搜索存儲爲像一個列表的列表:

tree = [[0, '1'], [1,'01'], [0,'001']] 

即它是一組霍夫曼碼。

from collections import deque 

def group(items): 
    right = [[item[0],item[1][1:]] for item in items if item[1].startswith('1')] 
    left = [[item[0],item[1][1:]] for item in items if item[1].startswith('0')] 

    return left, right 

def search(node): 
    loops = 0 
    to_crawl = deque(group(node)) 
    while to_crawl: 
     current = to_crawl.popleft() # this is the left branch of the tree 
     branch_sum = 0 
     if len(current)==1: 
      branch_sum = sum([t for t in current]) 
     else: 
      branch_sum = sum([t[0] for t in current]) 
     if branch_sum !=0 : 
      l,r = group(current) 
      to_crawl.extendleft(r) 
      to_crawl.extendleft(l) 
     loops += 1 
    return loops 

這裏就是我想要做的事:

給出一棵樹,用了很多的數據爲0的,找到1.要做到這一點,分裂樹分成兩個分支(通過group()函數)並推入deque。從deque中取出一個分支,然後對分支中的數據進行求和。如果總和不爲零,則將分支分成兩個子分支,將子分支推送到雙側。繼續這樣做直到找到非零基準。當我退出時,我最終會得到一個表單中的單個項目[1,'101']。

+0

你能告訴我們你的'group'功能?因爲它似乎對'to_crawl'變量的結構很重要。 – jorispilot

+0

已添加,但我認爲問題更多的是本地化。 –

+0

你能給我們樹本身的代碼嗎?我的意思是,如果我們沒有課堂和用例,那麼我們有點難以調試問題。另外,有沒有回溯? –

回答

2

我強烈認爲錯誤說

TypeError: 'int' object is not iterable 

,因爲你最終會傳遞一個2元組爲node

to_crawl = deque(group(node)) 

它給你2元雙端隊列。然後

current = to_crawl.popleft() 

給你一個單一的元素(整數)爲current。這顯然不是可迭代的,這導致了給定的錯誤。

邊注:爲簡潔起見,你可以使用像總和,而不是這個

sum(current) 

sum([x for x in current]) 
+0

如果我popleft()一個int爲什麼不會len(當前)拋出'int沒有len()'錯誤? –

+0

它會的,你是對的。 –

+0

我想要做的就是繼續彈出並將樹的分支推到deque上,直到deque中只有一個[0,'101'],然後退出循環。正如它在這裏寫的,一旦它達到這種情況,它會繼續彈出。 –