首先,复杂度为n^2的基本方式,将第一个对比节点的父节点全部入栈,而后将堆栈中的父节点序列跟第二个对比节点进行逐一比较,如果相等说明是最近的共同祖先:
- myLCA(node1, node2){
- parentNode :=[]
- while(node1!=NULL){
- parentNode.push(node1)
- node1 := node1.parent
- }
- while(node2!=NULL){
- for i in parentNode.size {
- if(parentNode(i)== node2){
- return node2;
- }
- }
- node2 := node2.parent
- }
- }
在前述方法的基础上优化一下,先后将两个对比节点的父节点序列依次入栈,得到两个可比较的堆栈,然后再循环出栈遍历,这个时候的顺序就是从上到下的遍历了,第一个不相等的节点表明开始分叉了,那么这个节点之前的所有堆栈中的节点都是共同祖先,应该可以达到O(N+M+L).下面算法找出最近的祖先节点:
- linearLCA(node1, node2){
- parentNode1 :=[]
- while(node1!=NULL){
- parentNode1.push(node1)
- node1 := node1.parent
- }
- parentNode2 :=[]
- while(node2!=NULL){
- parentNode2.push(node2)
- node2 := node2.parent
- }
- while(node1 == node2){
- oldNode1 := node1
- oldNode2 := node2
- node1 := parentNode1.pop()
- node2 := parentNode2.pop()
- }
- return oldNode1
- }