Leetcode 二叉樹的最近公共祖先

2021-10-20 04:54:01 字數 2134 閱讀 8255

題目描述:

給定乙個二叉樹, 找到該樹中兩個指定節點的最近公共祖先.

最近公共祖先的定義為:

對於有根樹 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 的最近公共祖先...