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

2021-07-15 00:24:09 字數 1090 閱讀 3843

情況一:

若該樹為bst則只需從根節點出發,開始和兩個輸入的節點進行比較。如果當前節點的值比兩個節點的值都大,則遞迴其左子樹;如果當前節點的值比兩個節點的值都小,則遞迴其右子樹;這樣從上到下找到的第乙個在兩個輸入節點之間的節點,就是最低公共祖先。

struct btnode  

; btnode* findlca(btnode* proot,int nfirst,int nsec)

else if (proot->m_nvalue < nfirst && proot->m_nvalue < nsec)

else

} return null;

}

情況二:一般樹+有指向parent的指標

思路:規劃為兩個相交鍊錶求交集。

情況三:一般二叉樹

方法一

下面是乙個簡單的複雜度為 o(n) 的演算法,解決lca問題

1) 找到從根到n1的路徑,並儲存在乙個向量或陣列中。

2)找到從根到n2的路徑,並儲存在乙個向量或陣列中。

3) 遍歷這兩條路徑,直到遇到乙個不同的節點,則前面的那個即為最低公共祖先.

第二種方法(只遍歷一次) 二叉樹的後序遍歷

自底向上遞迴:如果遍歷到的當前節點是a/b中的任意乙個,那麼就向父節點匯報此節點,否則遞迴到節點為null時返回空值。

1.當前節點不是兩個節點中的任意乙個,此時應該判斷左右子樹的返回結果。

。若左右子樹均返回非空值,那麼當前節點一定是所有的最低公共祖先,將當前節點逐級向上匯報 //兩個節點分居樹的兩側

。若左右子樹僅有乙個返回非空值,則將此非空節點向上級匯報。//節點僅存在樹的一側

。若左右子樹均返回null,則向父節點返回null。//節點不在這棵樹中

2.當前節點為兩個節點中的乙個,則向父節點返回當前節點。

注:本方法的侷限:

當樹中只有a/b中的乙個節點時,無法判斷樹中是否包含有第二個節點。

public treenode lca(treenode root, treenode a,treenode b)

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

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

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

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

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

題目 輸入一棵樹的兩個節點,返回他們的最低公共祖先。當這棵樹是二叉查詢樹時 用遞迴從樹的根節點開始遍歷。private treenode find treenode node1,treenode node2,treenode root if val如果這棵樹只是一顆普通的樹,但是擁有指向父節點的指標...