面試題 樹中兩個節點的最低

2021-08-26 18:02:51 字數 1270 閱讀 8698

題目是:輸入兩個樹節點,求它們的最低公共祖先。

你要向面試官問的問題:

1.這棵樹是不是二叉樹?

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

2.把題目稍微換一下。如果這棵樹不是二叉搜尋樹,甚至連二叉樹都不是,而只是普通的樹,又該怎麼辦呢?

此時需要詢問:樹的節點中有沒有指向父節點的指標?

答:如果樹中的每乙個節點(除了根節點之外)都有乙個指向父節點的指標,那麼這個問題可以轉換成求兩個鍊錶的第乙個公共節點。假設樹節點中指向父節點的指標是pparent,那麼從樹的每個葉節點開始都有乙個由指標pparent串起來的鍊錶,這些鍊錶的尾指標都是樹的根節點。輸入兩個節點,那麼這兩個節點位於兩個鍊錶上,它們的最低公共祖先剛好就是這兩個鍊錶的第乙個公共節點。

3.再把題目的要求改變一下,現在假設這棵樹是普通的樹,而且樹中的節點沒有指向父節點的指標。

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

舉例說明:

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

這種思路會對同乙個節點重複遍歷很多次,你想想還有沒有更快的演算法?

問:可以用輔助記憶體嗎? 如果可以的話,我的想法是用兩個鍊錶分別儲存從根節點到輸入的兩個節點的路徑,然後把問題轉換成兩個鍊錶的最後公共節點。

具體說說:

樹中兩個節點的最低公共父節點

題目 給出兩個結點a和b,求解這兩個結點的最低公共祖先 lca 條件 1 樹為二叉搜尋樹 思路 二叉搜尋樹指的是每個父節點有兩個子節點,並且節點的左子樹均小於節點值,右子樹上節點的值大於節點的值。所以我們求兩個節點的最低公共父節點應滿足 父節點大於其中乙個節點且小於另外乙個。如果此時搜尋的節點大於這...

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

首先想一下 一.如果是搜尋二叉樹的話 可以採用遞迴的方式 思路 樹的根節點作為尋找的起點,把根節點作為當前節點 1.如果這兩個節點都大於當前節點,那麼這兩個節點的最低祖先肯定在當前節點節點的右子樹中,然後在當前節點的右子樹中找 2.如果兩個節點的都小於當前節點節點,那麼這兩個節點的最低祖先肯定在當前...

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

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