我有一棵树而且它不是二叉树,所以我想比较所有节点并使用递归返回最大的节点。我有一个如何跟踪它的问题,因为我不能放一个全局变量,因为它必须是本地的...我猜...但是如果递归,它会重置局部变量。 / p>
def tree_max(node):
max=1
if node.left == None and node.right == None:
if node.value>max:
max=node.value
return max
elif node.left == None and node.right != None:
return tree_max(node)
elif node.left != None and node.right == None:
return tree_max(node.left)
else:
return tree_max(node.left)
有什么建议吗?
答案 0 :(得分:4)
您不需要在所有递归调用中保持变量的最大值,并且无论如何都不需要全局调用。在结构良好的递归中,结果将在每个递归调用的返回值中传递。像这样:
def tree_max(node):
maxleft = float('-inf') if not node.left else tree_max(node.left)
maxright = float('-inf') if not node.right else tree_max(node.right)
return max(node.value, maxleft, maxright)
以上假设node
不是None
,如果node
可以为null,则在调用tree_max()
之前检查此条件。< / p>
答案 1 :(得分:3)
我有一个遍历树的生成器。这意味着您可以编写min()
,sum()
等,而无需复制遍历逻辑
def tree_traverse(node):
if not node.left and not node.right: # if only leaf nodes have values
yield node.value
if node.left:
for v in tree_traverse(node.left):
yield v
if node.right:
for v in tree_traverse(node.right):
yield v
现在您可以使用max(tree_traverse(node))
如果所有节点都有值,您可以跳过第一个if
并继承yield
正如@abarnert所说,Python3.3有一种简化递归生成器的好方法
def tree_traverse(node):
if not node.left and not node.right: # if only leaf nodes have values
yield node.value
if node.left:
yield from tree_traverse(node.left)
if node.right:
yield from tree_traverse(node.right)
答案 2 :(得分:1)
这通常使用关键字参数来完成,例如
def tree_max(node, max=None):