【问题标题】:How can i find smallest value in a tree?如何在树中找到最小值?
【发布时间】:2015-04-27 18:09:55
【问题描述】:
def Find_Min(tree,smallest):
    if tree == []:  return smallest
    elif tree != []:
        if smallest > tree[0]: smallest = tree[0]
        Find_Min(tree[1],smallest)
        Find_Min(tree[2],smallest)

def main():
    array = [1, [0, [222,[],[]], [4,[],[]] ], [-6, [99,[],[]], []]]
    print("Smallest element in list: " + str(Find_Min(array,array[0])))

if __name__ == '__main__':
    main()

返回None

我在哪里做错了什么? 我期待-6

【问题讨论】:

  • 对于初学者来说,Find_Min 中没有 return 语句。并且函数参数不是这样工作的:简单地说,参数是值的“标签”,并且将某些内容分配给标签并不会修改它以前的值 - 它只是将标签附加到新值。
  • 仅仅从同一个函数中调用一个函数不会将内部调用的返回值传递给外部调用;你仍然需要明确地返回一些东西。

标签: python tree find traversal


【解决方案1】:

当您将树元素的访问与最小发现分开时,这会变得更容易。如果您需要它,它还可以非常容易地创建 find_max 函数:-)。这里有一些代码可以为你指明正确的方向......

def visit(tree):
    for elem in tree:
        if isinstance(elem, list):
           for subelem in visit(elem):  # yield_from visit(elem) on python3.3+
               yield subelem
        else:
           yield elem 

现在找到最小值就像在访问的元素上使用 min 函数一样简单:

def find_min(tree):
    return min(visit(tree))

【讨论】:

  • 请注意,如果您的(OP)数据结构更改为二叉搜索树或任何类型的智能排序树,则此答案会完全改变,这仅适用于需要全面探索的搜索空间(+1所有相同的ofc)虽然我会做一些像min(literal_eval(re.sub("[^0-9, ]","",str(my_tree))))这样的hacky
  • @JoranBeasley -- 是的。基本上,我实现了一个超级简单的深度优先搜索算法。如果它是二叉搜索树,那么您只需要遍历取左分支的树,直到到达底部(当然,OP 的树不是二叉的,而且它背后似乎没有任何押韵或原因我可以看到的元素的顺序)。另一个真正在这里唱歌的数据结构是堆...... find_min 会在 O(1) 中发生,并且标准库已经提供了一个实现 (heapq)!
  • 好吧,我明白了,但我必须使用我自己的代码。
猜你喜欢
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
相关资源
最近更新 更多