目錄
- 1. 題目
- 2. 解題思路
- 3. 資料型別功能函式總結
- 4. java代碼
1. 題目
給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先,
百度百科中最近公共祖先的定義為:“對于有根樹 T 的兩個結點 p、q,最近公共祖先表示為一個結點 x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個節點也可以是它自己的祖先),”
例如,給定如下二叉樹: 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:
輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
輸出: 5
解釋: 節點 5 和節點 4 的最近公共祖先是節點 5,因為根據定義最近公共祖先節點可以為節點本身,
說明:
所有節點的值都是唯一的,
p、q 為不同節點且均存在于給定的二叉樹中,
作者:Krahets
鏈接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/57euni/
來源:力扣(LeetCode)
著作權歸作者所有,商業轉載請聯系作者獲得授權,非商業轉載請注明出處,
2. 解題思路
根據之前二叉搜索樹最遠公共祖先結點的求解,可以考慮分為root、左子樹、右子樹三部分來考慮,
- 針對左右子樹,分別查找節點
p、q位于哪一側; - 如果兩個節點分別位于兩側,可以證明當前
root節點是最近的公共根節點; - 如果兩個節點并不位于兩側,從題目已知兩個節點一定在二叉樹中,因此可以推斷,兩個節點位于同一側;
- 若兩節點均位于左側,則公共根節點一定位于
root的左子樹中,右側同理 - 之后可考慮使用遞回來求解該問題,注意遞回的終止條件:
root==null或者root自身就是p、q之一,
對于節點p、q位于哪一側的查找,在演算法中使用findNode()函式進行遞回查找,
3. 資料型別功能函式總結
//無
4. java代碼
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//左右子樹中查找節點p\q,如果分別位于左右子樹,root為公共節點,不然說明兩個節點位于同一側,則直接到某一側查找
//查找節點——遍歷
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null||root==p||root==q){
return root;
}
//節點查找
boolean find_p_left=findNode(root.left,p);
boolean find_p_right=findNode(root.right,p);
boolean find_q_left=findNode(root.left,q);
boolean find_q_right=findNode(root.right,q);
if((find_p_left&&find_q_right)||(find_p_right&&find_q_left)){
return root;
}
else{
if(find_p_left){
return lowestCommonAncestor(root.left,p,q);
}
if(find_p_right){
return lowestCommonAncestor(root.right,p,q);
}
}
return root;
}
boolean findNode(TreeNode root,TreeNode x){//遞回查找節點
if(root==null){
return false;
}
else if(root ==x){
return true;
}
else{
return findNode(root.left,x)||findNode(root.right,x);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/546778.html
標籤:Java
上一篇:URule規則引擎
下一篇:mybatis原始碼-注解sql
