LeetCode236- 二叉樹的最近公共祖先
最近全國疫情嚴重,待在家裏沒事幹,馬上又要準備春招了,最近刷刷題,記錄一下!再說一句,武漢加油,大家出門記得戴口罩!
1、題目
給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。
百度百科中最近公共祖先的定義爲:“對於有根樹 T 的兩個結點 p、q,最近公共祖先表示爲一個結點 x,滿足 x 是 p、q 的祖先且 x 的深度儘可能大(一個節點也可以是它自己的祖先)。”
示例:
例如,給定如下二叉樹: root = [3,5,1,6,2,0,8,null,null,7,4]
輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
輸出: 3
解釋: 節點 5 和節點 1 的最近公共祖先是節點 3。
例如,給定如下二叉樹: root = [3,5,1,6,2,0,8,null,null,7,4]
進階: 遞歸算法很簡單,你可以通過迭代算法完成嗎?
2、思路
首先:
定義返回值的幾種情況:
1、如果以root爲根的子樹中包含p和q,則返回他們的最近公共祖先
2、如果只包含p,則返回p
3、如果只包含q,則返回q
4、如果都不包含,則返回NULL
分析情況:
如果左子樹爲空的時候
1、右邊也都不包含,則right=NULL
2、右邊只包含p或者q,則right=p或者q,最終返回p或者q
3、右邊同時包含p或者q,則right是最近公共祖先,我們最終返回最近的公共祖先
右子樹爲空時候,同理左子樹爲空。
3、代碼
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
/*
定義返回值的幾種情況:
1、如果以root爲根的子樹中包含p和q,則返回他們的最近公共祖先
2、如果只包含p,則返回p
3、如果只包含q,則返回q
4、如果都不包含,則返回NULL
*/
if(!root || root==p || root==q) return root;
//分別看一下左右子樹返回的值
auto left=lowestCommonAncestor(root->left,p,q);
auto right=lowestCommonAncestor(root->right,p,q);
/*
如果左子樹爲空的時候
1、右邊也都不包含,則right=NULL
2、右邊只包含p或者q,則right=p或者q,最終返回p或者q
3、右邊同時包含p或者q,則right是最近公共祖先,我們最終返回最近的公共祖先
*/
if(!left) return right;
if(!right) return left;
return root;
}
};
Java
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null || root==p || root==q) return root;
//分別看一下左右子樹返回的值
TreeNode left=lowestCommonAncestor(root.left,p,q);
TreeNode right=lowestCommonAncestor(root.right,p,q);
if(left==null) return right;
if(right==null) return left;
return root;
}
}