有一個千萬級節點的樹,已知兩個節點,如何他們的共同祖先?


首先,復雜度為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. }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM