我需要通过检查节点的分支总和是否大于零来搜索树。但是,我遇到了求和的问题 - 我在
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() 函数)并推送到双端队列。从双端队列中弹出一个分支,然后对分支中的数据求和。如果总和不为零,则将分支拆分为两个子分支,将子分支推送到双端队列。继续这样做,直到我找到非零数据。当我退出时,我应该在双端队列中得到一个 [1,'101'] 形式的项目。