情況一:
若該樹為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如果這棵樹只是一顆普通的樹,但是擁有指向父節點的指標...