【发布时间】:2013-04-27 18:27:33
【问题描述】:
我有一个数字列表:
[1, 2, 3, 4, 5, 6, 7]
如果列表中有一棵树,我有兴趣找到一种算法,该算法可以汇总此列表中的所有子项:
1
/ \
2 3
/ \ / \
4 5 6 7
我正在寻找一种算法:
[6, 2, 2, 0, 0, 0, 0]
A = 6
B = 2
C = 2
D = 0
E = 0
F = 0
G = 0
每个节点(除了叶子)都有两个孩子。唯一的例外是如果列表是偶数:
1
/ \
2 3
/ \ /
4 5 6
我想避免构建一棵树,然后计算每个节点的子节点数。必须有一种简单的数学方法来计算列表中的孩子的数量?
【问题讨论】:
-
为什么树看起来和你的例子一样?具体来说,为什么 5 不是 2 而不是 6 的儿子?
-
如何将数组转换为树?在您的示例中,您从根开始,然后是 l(eft) 节点,十个 r(ight) 节点,然后是 ll,然后是 rl,然后是 lr,然后是 rr,接下来是什么? lll,rll,lrl,rrl,llr,rlr,lrr,rrr?基本上首先是下一代的所有左节点,然后是下一代的右节点?
-
谢谢。我在原始树中有一个错误。
-
@Gal 我假设他将任意树根植于任意节点,并且子树结构由 BFS 诱导。只有在数据结构中,树才被认为是有根有序的,通常情况并非如此。
-
@turtle 您可以在构建/更改树时跟踪所需的信息,只需使用反映该信息的计数器增加节点,并在更改时将该更改传播到根。这将花费与需要更改计数器的插入/删除/旋转/(无论更改树的结构)操作相同的复杂性。
标签: algorithm