探析求樹中兩個節點p和q的最低公共祖先

2022-04-08 03:20:12 字數 2274 閱讀 1111

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

描述十分簡潔的題目,其實有多種變體;

我們從4種情況來討論:

情況1,在二叉搜尋樹中找節點p和q的最低公共祖先

情況2,非二叉搜尋樹,只是普通的二叉樹,樹中每個節點包含指向父節點的指標

情況3,非二叉搜尋樹,只是普通的二叉樹,且樹中每個節點不包含指向父節點的指標

情況4,非二叉樹,只是普通的多叉樹,且樹中每個節點不包含指向父節點的指標  

該情況是最簡單的形式,根據二叉搜尋樹的特性,依次從根節點出發遍歷,查詢第乙個值在p和q中間的節點即可。

/*(1)情況1,在二叉搜尋樹中找節點p和q的最低公共祖先*/

/*二叉搜尋樹節點結構*/

typedef struct bstnode

};bstnode *getlastcommonparent1(bstnode *root, bstnode *p, bstnode *q)

//如果兩個節點p,q的值比根節點ret都小,則最低公共祖先在左子樹

else if (ret->val > p->val && ret->val > q->val)

//如果ret的值在p和q的中間,則ret即是p和q的最低公共祖先

else

}//while

return ret;

} 此時,所給節點p和q均有一條指向跟節點root的鍊錶。該題目即可轉換為兩個鍊錶的第乙個公共節點。

/*(2)情況2,非二叉搜尋樹,只是普通的二叉樹,樹中每個節點包含指向父節點的指標

此時,所給節點p和q均有一條指向跟節點root的鍊錶。該題目即可轉換為兩個鍊錶的第乙個公共節點。

*//*含有父節點指標的普通二叉樹節點結構*/

typedef struct tpnode

};tpnode *getlastcommonparent2(tpnode *root, tpnode *p, tpnode *q)

tpnode *qtmp = q;

while (qtmp != null)

ptmp = p;

qtmp = q;

if (plen > qlen)

//while

} else

}//else

while (ptmp != qtmp)

return ptmp;

} 此時,順著一條p和q都在同一邊的鍊子,也就是說,如果p和q都在某節點的左邊,就到左子樹中去查詢公共祖先,如果都在右邊就去右子樹去查詢公共祖先。要是p和q不在同一邊,那麼就表示已經找到第乙個公共祖先。

/*(3)情況3,非二叉搜尋樹,只是普通的二叉樹,且樹中每個節點不包含指向父節點的指標

此時,順著一條p和q都在同一邊的鍊子,也就是說,如果p和q都在某節點的左邊,就到左子樹中去

查詢公共祖先,如果都在右邊就去右子樹去查詢公共祖先。要是p和q不在同一邊,那麼就表示已經找到第乙個公共祖先。

*//*不含父節點指標的普通二叉樹節點結構*/

typedef struct btnode

};bool judge(btnode *root, btnode *p)

btnode *getlastcommonparent3(btnode *root, btnode *p, btnode *q)

//否則如果p和q都在root的右邊

else if(!isponleft && !isqonleft)

//否則,說明p和q不在同一邊,此時便找到兩者最低公共祖先

else

} 此時,先求得從根節點到p和q的路徑,轉換為求鍊錶的最後乙個公共子節點。

/*(4)情況4,非二叉樹,只是普通的多叉樹,且樹中每個節點不包含指向父節點的指標

此時,先求得從根節點到p和q的路徑,轉換為求鍊錶的最後乙個公共子節點。

*//*含有父節點指標的普通二叉樹節點結構*/

typedef struct treenode

};//獲取node節點在樹root中的路徑

bool getnodepath(treenode *root, treenode *node, vector &path)

//while

if (!found)

path.pop_back();

return found;

}treenode *getlastcommonnode(vector pv, vector qv)

//while

return ret;

}treenode *getlastcommonparent4(treenode *root, treenode *p, treenode *q)

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

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

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

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

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

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