樹中兩個節點的最低公共祖先。
描述十分簡潔的題目,其實有多種變體;
我們從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 ...