題目描述:
給定乙個二叉樹, 找到該樹中兩個指定節點的最近公共祖先.
最近公共祖先的定義為:
對於有根樹 t 的兩個節點 p、q,最近公共祖先表示為乙個節點 x;
滿足 x 是 p、q 的祖先且 x 的深度盡可能大(乙個節點也可以是它自己的祖先)
測試用例:
輸入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
輸出:3
解釋:節點 5 和節點 1 的最近公共祖先是節點 3
思路1(利用先序遍歷)
- 先判斷root是否為空,為空直接返回null;
- 如果root==p或者q,直接返回root;
- 遞迴遍歷並判斷左子樹是否包含p和q,包含則遞迴呼叫找公共祖先的函式;
- 如果均不包含就遞迴遍歷並判斷右子樹中是否包含p和q,包含則遞迴呼叫找
公共祖先的函式;
**如下:
public
class
solution
if(root == tmp)
//遞迴判斷左子樹中是否含有tmpif(
search
(root.left,tmp)
)return
search
(root.right,tmp);}
public treenode lowestcommonancestor
(treenode root, treenode p, treenode q)
if(p == root || q == root)
//判斷p是否在左子樹中
boolean pinleft =
search
(root.left,p)
;//判斷q是否在左子樹中
boolean qinleft =
search
(root.left,q);if
(pinleft && qinleft)if(
!pinleft &&
!qinleft)
return root;
}}
思路2(利用後序遍歷)
- 先判斷root是否為空,為空直接返回null;
- 定義乙個全域性變數lca表示公共祖先;
- 先判斷左子樹中是否含有p或者q,有則返回1,無則返回0,記作left;
- 判斷右子樹中是否含有p或者q,有則返回1,無則返回0,記作right;
- 判斷根節點是否為p或者q,是則返回1,不是則返回0,記作mid;
- 若left+right+mid == 2,則將此時的root賦值給lca;
- 若left+right+mid <= 0,證明沒有公共祖先;
**如下:
public
class
solution1
int left =
findnode
(root.left,p,q)?1
:0;int right =
findnode
(root.right,p,q)?1
:0;int mid =
(root == p || root == q)?1
:0;if
(left+right+mid ==2)
return
(left+right+mid)
>0;
}public treenode lowestcommonancestor
(treenode root, treenode p, treenode q)
findnode
(root,p,q)
;return lca;
}}
LeetCode第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 的最近公共祖先是節點 ...
leetcode 235 二叉搜尋樹的最近公共祖先
給定乙個二叉搜尋樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉搜尋樹 root 6,2,8,0,4,7,9,null,null,3,5 示例1 輸入 root 6,2,8,0,4,7,9,null,null,3,5 p 2,q 8 輸出 6 解釋 節點 2 和節點 8 的最近公共祖先是...
LeetCode 235 二叉搜尋樹的最近公共祖先
給定乙個二叉搜尋樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉搜尋樹 root 6,2,8,0,4,7,9,null,null,3,5 示例 1 輸入 root 6,2,8,0,4,7,9,null,null,3,5 p 2,q 8 輸出 6 解釋 節點 2 和節點 8 的最近公共祖先...