在我的answer到this问题中,我使用了两个通过临时方式得出的公式,我对这些公式为什么起作用的简单解释感到茫然 . 这是完整的问题:
考虑一个高度为H的perfect或完整的K-ary树,其中每个节点在广度优先遍历中用它们的等级标记,并且在其中每个节点以深度优先顺序标记 . 以下是K = 2,H = 2的示例:
_ 0 _ _ 0 _
/ \ / \
1 2 1 4
/ \ / \ / \ / \
3 4 5 6 2 3 5 6
对于BF有序树,深度为D的节点N的第i个子节点由下式给出:
K*N + 1 + i
对于DF有序树,深度为D的节点N的第i个子节点由下式给出:
N + 1 + i*step, where step = (K^(H - D) - 1) / (K - 1)
这些公式的直观解释是什么?
在查看任何手绘示例时,BF命令公式对我来说很有意义,但我不能说出它为什么有效 . 在DF订购的案例中,我能想到的最好的是:
对于高度为H的DFS编号的K-ary树中的深度为D的节点N,其第一个子节点仅为N 1,因为它是在深度优先遍历中要访问的下一个节点 . 在访问以第一个孩子(N 1)为根的整个子树之后,将直接访问N的第二个孩子,该子树本身是高度为H - (D 1)的完整K-ary树 . 任何完整的K-ary树的大小由这里解释的有限几何级数的总和给出 . 所述子树的大小是第一和第二子节点之间的距离,并且实际上,所有兄弟节点之间的距离相同,因为它们的每个子树具有相同的大小 . 如果我们称这个距离为步骤,那么:第一个孩子是N 1第二个孩子是N 1步骤第3个孩子是N 1个步骤......依此类推 .
谁能为这些公式的工作方式或原因提供更好的解释?
1 回答
对于BFS:
如果节点
N
位于深度D
并且N
之前有a
个节点,深度为D
(之后为b
个节点):在第一个孩子之前会标记多少个节点?深度为
D
的剩余节点和深度为D+1
的a * K
"child"节点将在之前出现 . 因此,如果C
是N
的第一个孩子的标签:事实上,在深度
D
处有K^D
个节点,所以a + b + 1 = K^D
,因此:对于DFS:
要计算步长的大小,您必须计算剩余子树的大小,并且像完美K-ary树的子树本身就是一个完美的K-ary树,您可以计算其节点数 .