树找祖先的问题,往往从叶子节点出发,沿着根的路径往上回溯,效率高效。
最容易想到的方法,分别记录两个节点的回溯路径,然后比较两个记录。对于"千万级节点的树",记录数会非常多,涉及非常多的查找时间。

以下是我根据网上的资料整理的一个思路:
1.建立树时,给每个节点加入层次编号。选取两个节点时,取出层次编号,层次编号大的节点从这个层次的祖先节点,回溯依次入栈祖先节点。
2.这样每个栈的栈顶就是根结点。栈底就是结点本身。
3.每个栈同时出栈,当某一步两个栈顶的元素不等或某一栈为空时,则前一个出栈的元素就是所求的最近公共祖先。

199415 answered 12 years, 2 months ago

Your Answer