樹中兩個結點的最低公共祖先

2021-09-23 06:08:50 字數 2041 閱讀 6452

遇到這個題要分幾種情況

1、該樹是一棵二叉搜尋樹:

由於二叉搜尋樹是排序過的,位於左子樹的結點都比父節點小,而位於右子樹的結點都比父節點大,我們只需要從樹的根節點開始和兩個輸入的結點進行比較。如果當前結點的值都比兩個結點的值大,那麼最低的共同父節點一定是在當前結點的左子樹中,於是下一步遍歷當前結點的左結點。如果當前結點的值都比兩個節點的值小,那麼最低共同父節點一定在當前結點的右子樹中,於是下一步遍歷當前結點的右子結點。這樣在樹中從上到下找到的第乙個在兩個輸入結點的值之間的結點,就是最低公共祖先。

2、該樹甚至連二叉樹都不是,而只是普通的樹,該怎麼辦?

(1)樹的結點中有指向父節點的指標

如果樹中每個結點(除根節點之外)都有乙個指向父節點的指標,這個問題可以轉換成求兩個鍊錶的第乙個公共結點。假設樹結點中指向父節點的指標是pparent,那麼從樹的每乙個葉結點開始都有乙個由指標pparent串起來的鍊錶,這些鍊錶的尾指標都是樹的根節點。輸入兩結點,那麼這兩個結點位於兩個鍊錶上,它們的最低公共祖先剛好就是這兩個鍊錶的第乙個公共結點。比如輸入的兩個結點分別為f和h,那麼f在鍊錶f->d->b->a上,而h在鍊錶h->e->b->a上,這兩個鍊錶的第乙個交點b剛好也是它們最低公共祖先

(2)該樹中沒有指向父節點的指標

<1>所謂兩個結點的公共祖先,指的是這兩個結點都出現在某個結點的子樹中,我們可以從根節點開始遍歷一棵樹,每遍歷到乙個結點時,判斷兩個輸入結點是不是在它的子樹中。如果在子樹中,則分別遍歷它的所有子節點,並判斷兩個輸入結點是不是在它們的子樹中。這樣從上到下一直找到的第乙個結點,它自己的子樹中同時包含兩個輸入的結點而它的子節點卻沒有,那麼該結點就是最低的公共祖先。

舉例說明:假設還是輸入結點f和h。我們先判斷a的子樹中是否同時包含結點f和h,得到的結果為true。接著我們再先後判斷a的兩個子節點b和c的子樹是不是同時包含f和h,結果是b的結果是true而c的結果是false。接下來我們再判斷b的兩個子節點d和e,發現這兩個結點得到的結果都是false。於是b是最後乙個公共祖先。然後輸出

上面的這種解法,當判斷以a為根的樹中是否含有結點f的時候,我們需要對d、e等結點遍歷一遍;接下來判斷以結點b為根的樹中是否含有結點f的時候,我們還需要對d、e等結點再遍歷一次。這種思路同對同乙個結點重複遍歷很多次。下面這種演算法將更快

<2>使用輔助記憶體:用兩個鍊錶分別儲存根結點到輸入的兩個結點的路徑,然後把問題轉換成兩個鍊錶的最後公共結點

我們先得到一條從根節點到樹中某一結點的路徑,這就要求在遍歷的時候,有乙個輔助記憶體來儲存路徑。比如我們用前序遍歷的方法來得到從根節點到h的路徑的過程是這樣的:(1)遍歷到a,把a存放到路徑中去,路徑中只有乙個結點a;(2)遍歷到b,把b放到路徑中去,此時路徑為a->b;(3)遍歷到d,把d存放到路徑中去,此時路徑為a->b->d;(4)遍歷到f,把f存放到路徑中去,此時路徑為a->b->d->f;(5)f已經沒有子節點了,因此這條路就不可能到達結點h。把f從路徑中刪除,變成a->b->d;(6)遍歷g。和結點f一樣,這條路徑也不能到達h。遍歷完g之後,路徑任然是a->b->d;(7)由於d的所有子節點都遍歷過了,不可能到達結點h,因此d不在從a到h的路徑中,把d從路徑刪除,變成a->b;(8)遍歷e,把e加入到路徑中,此時路徑變成a->b->e,(9)遍歷h,已經到達目標結點,a->b->e就是從根節點開始到達h必須經過的路徑。同樣,我們也可以得到從根節點開始到達f必須經過的路徑是a->b->d。接著,我們求出這兩個路徑的最後公共結點,也就是b。b這個系欸但也是f和h的最低公共祖先

時間複雜度和空間複雜度:

為了得到從根節點開始到輸入的兩個結點的兩條路徑,需要遍歷兩次樹,每一次遍歷的時間複雜度是o(n)。得到兩條路徑的長度在最差情況時是o(n),通常情況下兩條路徑的長度是o(logn)

樹中兩個結點的最低公共祖先

題目 輸入兩個樹結點,求它們的最低公共祖先 題目一 如果這個樹是二叉搜尋樹,二叉搜尋樹是排序過的,位於左子樹的結點都比父結點小,而位於右子樹的結點都比父結點大,我們只需要從樹的根結點開始和兩個輸入的結點比較,如果輸入兩個結點都比根結點小,那麼最低的共同父結點一定在當前結點的左子樹中,於是下一步遍歷當...

樹中兩個結點的最低公共祖先

在進行這個問題之前,我們需要考慮以下幾個問題 1 題目告訴我們是樹,但是沒有告訴我們是一棵怎樣的樹。這裡的樹可以分為三種結構。第一種 普通的二叉樹 第二種 結點中含有指向父親結點的指標 第三種 二叉搜尋樹。2 對於不同結構的樹,處理的方式是不一樣的,時間複雜度也是不一樣的,我們需要針對每種結構設計解...

樹中兩個結點的最低公共祖先

場景一 二叉搜尋樹bst 假設是二叉搜尋樹 二叉搜尋樹是乙個排序的二叉樹,左子樹的結點小於根結點,右子樹的結點大於根結點 故找到乙個結點,使其大於左子結點小於右子結點即可。public static treenode getlastcommonnode treenode proot,treenode...