问题:
找出二叉树中两个节点的最近公共祖先。
首先可以先参考下这个博客http://blog.csdn.net/cxllyg/article/details/7635992 ,写的比较详细,包括了节点包含父指针和不包括父指针的情况,还介绍了经典的Tarjan算法。
Tarjan算法很精妙,但是使用了并查集,需要额外O(n)的存储空间。上面博客中给的第三个方法也是需要记录根到节点的路径,需要O(log n)空间,当然考虑到一般情况下我们遍历树都是递归的方式,所以本身方法调用栈就是O(log n)空间占用率。 但是这是对于平衡的二叉树而言的,在最差情况下空间占用率还是O(n)。
所以,这里我给的算法不需要记录根到节点的路径,而且仅仅遍历树一遍就可以完成。
1. 首先深度遍历树,找到第一个

本文介绍了一种在二叉树中寻找两个节点最近公共祖先的算法,该算法仅遍历一次树(O(n)时间复杂度),且空间复杂度为O(1),不考虑函数调用栈的空间。首先通过深度优先搜索找到第一个节点p,然后继续搜索以找到第二个节点q。若找到q,最近公共祖先即为p;否则回溯至上一层,祖先更新为p的父节点。如果p等于q,则返回p,若两者不在树中,返回空。
)&spm=1001.2101.3001.5002&articleId=44805897&d=1&t=3&u=43f5ac74938742469c048ce97b168423)
629

被折叠的 条评论
为什么被折叠?



