二叉树访问:从一片叶子到另一片叶子

时间:2011-02-25 09:54:19

标签: algorithm data-structures binary-tree

问题:我有一个二叉树,所有叶子都有编号(从左到右,从0开始),它们之间不存在连接。

我想要一个算法,给定两个索引(2个不同的叶子),从较大的叶子(具有较高索引的叶子)开始访问树,然后到达较低的叶子。

树的内部节点不包含任何有用的信息。

我应该只选择基于叶子索引的路径。路径从叶子开始并终止于叶子上,当然,如果我知道它的索引(通过指针数组),我可以访问叶子

树是静态的,不允许插入或删除节点。

我已经开发出一种算法来做到这一点,但它确实糟透了......任何想法?

2 个答案:

答案 0 :(得分:4)

一种选择是找到两个节点中最不共同的祖先,以及应从每个节点获取到该祖先的节点序列。这是算法的草图:

  1. 从每个节点开始,向后走到该节点的父节点,直到到达根节点。计算从每个节点到根的路径上的节点数。设第一个节点的高度为h 1 ,第二个节点的高度为h 2

  2. 设h = min(h 1 ,h 2 )。这是两个节点中较高节点的高度。

  3. 从每个节点开始,继续关注节点的父指针,直到两个节点都处于高度h。记录您在此步骤中遵循的节点。此时,两个节点都处于相同的高度。

  4. 在找到公共节点之前,请继续从每个节点向上行进到其父节点。最终你会击中他们共同的祖先。此时,请遵循从第一个节点到此祖先的路径,然后沿着从祖先向下到第二个节点的路径。

  5. 在最坏的情况下,这需要O(h)时间和O(h)空间,其中h是树的高度。对于平衡二叉树来说,这个O(lg n)时间和空间非常好。

    如果您对此算法的Much More Hardcore版本感兴趣,请考虑查看Tarjan's Least Common Ancestors算法,该算法具有线性预处理时间,可用于比此更快地找到最不常见的祖先。< / p>

    希望这有帮助!

答案 1 :(得分:0)

任何两个节点之间的距离可以借助最低共同祖先来计算:

 Dist(n1, n2) = Dist(root, n1) + Dist(root, n2) - 2*Dist(root, lca)

其中lca是最低共同祖先。

请参阅this以获取有关此算法的更多帮助,并参阅此video了解如何计算lca。