236 二叉樹的最近公共祖先(快手面試)

2022-01-15 13:29:09 字數 1312 閱讀 8632

最近公共祖先的定義: 設節點 rootroot 為節點 p, qp,q 的某公共祖先,若其左子節點 root.leftroot.left 和右子節點 root.rightroot.right 都不是 p,qp,q 的公共祖先,則稱 rootroot 是 「最近的公共祖先」 。

根據以上定義,若 rootroot 是 p, qp,q 的 最近公共祖先 ,則只可能為以下情況之一:

pp 和 qq 在 rootroot 的子樹中,且分列 rootroot 的 異側(即分別在左、右子樹中);

p = rootp=root ,且 qq 在 rootroot 的左或右子樹中;

q = rootq=root ,且 pp 在 rootroot 的左或右子樹中;

方法1:深度優先搜尋+遞迴

思路:(1) 遞迴搜尋二叉樹,找到 p 和 q 的最近公共父節點。

(2) 如果 p 和 q 分別位於原二叉樹的左右分支,則直接返回根節點。

方法二:利用對根節點左子樹進行中序遍歷,找p,q是不是都在左子樹,如果都在,對根節點左子節點遞迴,如果乙個在乙個不在,返回root

class solution 

stackstack=new stack<>();

treenode cur=root.left;//對左子樹做遍歷,找左子樹裡面有沒有p,q

while(cur!=null||!stack.isempty())

cur=stack.pop();

if(cur.val==p.val)

if(cur.val==q.val)

if(pleft&&qleft)

cur=cur.right;

}if(pleft&&qleft) return lowestcommonancestor(root.left,p,q);

if(qleft||pleft) return root;//乙個在左子樹,乙個右子樹,此時說明最近公共祖先是根節點

return lowestcommonancestor(root.right,p,q);}}

236 二叉樹最近公共祖先

給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。最近公共祖先的定義為 對於有根樹 t 的兩個結點 p q,最近公共祖先表示為乙個結點 x,滿足 x 是 p q 的祖先且 x 的深度盡可能大 乙個節點也可以是它自己的祖先 例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,nu...

236 二叉樹的最近公共祖先

給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 示例 1 輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 1輸出 3解釋 節點5和節點1的最近公共祖先是節點3。示例 2 ...

236 二叉樹的最近公共祖先

給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 示例 1 輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 1 輸出 3 解釋 節點 5 和節點 1 的最近公共祖先是節點 ...