有一个千万级节点的树,已知两个节点,如何他们的共同祖先?

首先,复杂度为n^2的基本方式,将第一个对比节点的父节点全部入栈,而后将堆栈中的父节点序列跟第二个对比节点进行逐一比较,如果相等说明是最近的共同祖先:

  1. myLCA(node1, node2){
  2.     parentNode :=[]
  3.     while(node1!=NULL){
  4.          parentNode.push(node1)
  5.          node1 := node1.parent
  6.     }
  7.      while(node2!=NULL){
  8.          for i in parentNode.size {
  9.              if(parentNode(i)== node2){
  10.                  return node2;
  11.              }
  12.          }
  13.          node2 := node2.parent
  14.      }
  15. }

 

在前述方法的基础上优化一下,先后将两个对比节点的父节点序列依次入栈,得到两个可比较的堆栈,然后再循环出栈遍历,这个时候的顺序就是从上到下的遍历了,第一个不相等的节点表明开始分叉了,那么这个节点之前的所有堆栈中的节点都是共同祖先,应该可以达到O(N+M+L).下面算法找出最近的祖先节点:

  1. linearLCA(node1, node2){
  2.     parentNode1 :=[]
  3.     while(node1!=NULL){
  4.          parentNode1.push(node1)
  5.          node1 := node1.parent
  6.     }
  7.     parentNode2 :=[]
  8.     while(node2!=NULL){
  9.          parentNode2.push(node2)
  10.          node2 := node2.parent
  11.     }
  12.     while(node1 == node2){
  13.         oldNode1 := node1
  14.         oldNode2 := node2
  15.         node1 := parentNode1.pop()
  16.         node2 := parentNode2.pop()
  17.     }
  18.     return oldNode1
  19. }
posted @ 2012-10-03 15:52  hktkhhhh  阅读(2183)  评论(6编辑  收藏  举报