我需要通過檢查節點的分支總和是否大於零來搜索樹。然而,我遇到了總和問題 - 我得到一個類型錯誤(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']。
你能告訴我們你的'group'功能?因爲它似乎對'to_crawl'變量的結構很重要。 – jorispilot
已添加,但我認爲問題更多的是本地化。 –
你能給我們樹本身的代碼嗎?我的意思是,如果我們沒有課堂和用例,那麼我們有點難以調試問題。另外,有沒有回溯? –