上面的函数AllPaths()
将包含二叉树每个叶的路径的数组附加到全局数组res
。
代码工作正常,但我想删除全局变量res
,并使函数返回数组。我怎么能那样做?
class Node:
def __init__(self, value, left=None, right=None) -> None:
self.value = value
self.left = left
self.right = right
res = []
def allPaths(node, arr=[]):
if node:
tmp = [*arr, node.value]
if not node.left and not node.right: # Leaf
res.append(tmp)
allPaths(node.left, tmp)
allPaths(node.right, tmp)
root = Node(1)
root.left = Node(2);
root.left.left = Node(4);
root.left.right = Node(5);
root.right = Node(3);
root.right.right = Node(6);
"""
1 <-- root
/ \
2 3
/ \ \
4 5 6 <-- leaves
"""
allPaths(root)
print(res)
# Output : [[1, 2, 4], [1, 2, 5], [1, 3, 6]]
您可以在递归中传递当前路径:
def allPaths(node,path=[]):
if not node: return # no node, do nothing
if node.left or node.right: # node is not a leaf, recurse down
yield from allPaths(node.left,path+[node.value]) # left leaves if any
yield from allPaths(node.right,path+[node.value]) # right leaves if any
else:
yield path+[node.value] # leaf node, return full path
一种方法是通过回溯来实现:
def allPaths(node, partial_res, res):
if not node:
return
if not node.left and not node.right:
res.append(partial_res[:] + [node.value])
return
partial_res.append(node.value)
allPaths(node.left, partial_res, res)
allPaths(node.right, partial_res, res)
partial_res.pop()
res = []
allPaths(root, [], res)
print(res)
一个简单的方法可以让您完全避免内部列表和全局列表,就是创建一个生成器,在它们到来时生成值。然后,您可以将此传递到list
以获得最终结果:
class Node:
def __init__(self, value, left=None, right=None) -> None:
self.value = value
self.left = left
self.right = right
def allPaths(node):
if node:
if not node.left and not node.right: # Leaf
yield [node.value]
else:
yield from ([node.value] + arr for arr in allPaths(node.left))
yield from ([node.value] + arr for arr in allPaths(node.right))
root = Node(1)
root.left = Node(2);
root.left.left = Node(4);
root.left.right = Node(5);
root.right = Node(3);
root.right.right = Node(6);
g = allPaths(root)
list(g)
# [[1, 2, 4], [1, 2, 5], [1, 3, 6]]
统计二叉树的叶结点个数 根据带虚结点的先序序列建立二叉树,计算其叶子结点的数目后输出。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据在一行中输入一个字符串(不含空格且长度不超过80),表示二叉树的先序遍历序列,其中字符*表示虚结点(对应的子树为空)。 输出格式: 对于每组测试,输出所建立的二叉树的叶子结点数目。输出格式为:“leaf:num”,其中num 为二叉树的叶结点个数。 输入样例
我试图搜索给定红黑树中所有根到叶的路径。特别是,我想编写一个测试,在给定rbt的情况下,该测试将断言每个路径具有相同数量的黑色节点。 我用两个全局变量尝试这样的东西: 然而,当左分支中的黑色节点右侧有红色节点时,我遇到了麻烦,因为这意味着计数比应该减少的更多。 有没有更好的方法来搜索根到叶的路径,计算特定值的频率,然后以某种方式比较计数?或者,如果给定rbt余额,是否有一种完全不同的方法来测试rb
我试图找到从根到叶的最小路径和,还需要计算最小路径。如果解决方案在左子树中,我的解决方案有效,但是如果结果在右子树中,根节点在结果路径中添加了两次,是否有人可以查看我的解决方案并帮助我修复此错误,如果有,还可以建议更好的运行时解决方案 我正在使用回溯访问所有节点,我认为我的解决方案的时间复杂度将是O(N)(因为所有节点都应该被访问,如果我错了,请纠正我)
本文向大家介绍二叉树中叶子节点的统计和树高问题,包括了二叉树中叶子节点的统计和树高问题的使用技巧和注意事项,需要的朋友参考一下 1、已知二叉树以二叉链表进行存储,其中结点的数据域为data,编写算法,统计二叉树中叶子结点值等于x的结点数目。 2、已知一棵二叉链表方式存储的二叉树,编写算法计算二叉树的高度。 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值
这是一个相当简单的问题,我注意到当我表示一棵树时,无论我用哪种方式(后排序,按顺序,前排序)树叶总是以相同的顺序出现,从左到右。 我只是想知道为什么,这是有原因的吗? 我刚开始研究它们,就想到了这个。 编辑: 我有一棵这样的树: 叶节点为:D、E和F 预购顺序为:A、B、D、C、E、F 顺序是:D,B,A,E,C,F 后序是:D,B,E,F,C,A 叶子节点总是从左到右出现,不管我选择哪个顺序,问
问题查找具有n个节点的完整二叉树中的叶节点数。 我为上述问题编写了一个递归程序,每当我到达一个没有子节点的节点时,遍历树并增加叶节点的数量。但由于这棵树是一棵完整的二叉树,我认为这会使问题变得更容易,但我不知道如何解决。它是否可以简化为紧凑形式(类似于公式)。