问题:我有一个二叉树,所有叶子都有编号(从左到右,从0开始),它们之间不存在连接。
我想要一个算法,给定两个索引(2个不同的叶子),从较大的叶子(具有较高索引的叶子)开始访问树,然后到达较低的叶子。
树的内部节点不包含任何有用的信息。
我应该只选择基于叶子索引的路径。路径从叶子开始并终止于叶子上,当然,如果我知道它的索引(通过指针数组),我可以访问叶子
树是静态的,不允许插入或删除节点。
我已经开发出一种算法来做到这一点,但它确实糟透了......任何想法?
答案 0 :(得分:4)
一种选择是找到两个节点中最不共同的祖先,以及应从每个节点获取到该祖先的节点序列。这是算法的草图:
从每个节点开始,向后走到该节点的父节点,直到到达根节点。计算从每个节点到根的路径上的节点数。设第一个节点的高度为h 1 ,第二个节点的高度为h 2 。
设h = min(h 1 ,h 2 )。这是两个节点中较高节点的高度。
从每个节点开始,继续关注节点的父指针,直到两个节点都处于高度h。记录您在此步骤中遵循的节点。此时,两个节点都处于相同的高度。
在找到公共节点之前,请继续从每个节点向上行进到其父节点。最终你会击中他们共同的祖先。此时,请遵循从第一个节点到此祖先的路径,然后沿着从祖先向下到第二个节点的路径。
在最坏的情况下,这需要O(h)时间和O(h)空间,其中h是树的高度。对于平衡二叉树来说,这个O(lg n)时间和空间非常好。
如果您对此算法的Much More Hardcore版本感兴趣,请考虑查看Tarjan's Least Common Ancestors算法,该算法具有线性预处理时间,可用于比此更快地找到最不常见的祖先。< / p>
希望这有帮助!
答案 1 :(得分:0)