寻找二叉树的最近公共祖先

1.题目

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例 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 。因为根据定义最近公共祖先节点可以为节点本身。

2.思路

情况1:根节点为空,直接返回NULL
情况2:p或q中有一个为空,返回非空的那个
情况3:p或q其中一个是另一个的祖先结点,返回是祖先结点的那个
情况4:p和q分别位于他们最近公共结点的两侧

3.代码

class Solution {
    
    
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    
    
        if(!root || root==p || root==q)     //root为空,或root挂了p,或root挂了q
            return root;

        TreeNode* left = lowestCommonAncestor(root->left, p, q);    //左子树上找p、q
        TreeNode* right = lowestCommonAncestor(root->right, p, q);  //右子树上找p、q

        if(left && right)   //p、q刚好挂在root的左右子树上
            return root;
        
        return left?left:right; //p、q同时挂在root的左子树上或者右子树上
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43202635/article/details/115419571