LeetCode236- 二叉樹的最近公共祖先

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;    
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章