剑指offer Leetcode 68-II.二叉树的最近公共祖先

image-20201222111742238

解法:递归

思想:

●终止条件:

​ 1.root为NULL,返回NULL

​ 2.p或q为root,直接返回root

●递推:

​ 1.对左子进行递归,返回值记为left

​ 2.对右子进行递归,返回值记为right

●返回值:根据left和right为空和不为空,展开为四种情况

​ 1.同时为空,说明左右子树都不包含p和q,返回NULL

​ 2.同时不为空,说明一个在左,一个在右,返回root

​ 3.left为空,right不为空,说明p,q都不在left中,返回right

​ 4.right为空,left不为空,说明p,q都不在right中,返回left

复杂度:

●时间:O(N),最差情况下需要递归遍历树的所有节点

●空间:O(N),最差情况下,递归深度达到N

注意:

递归时一定要明确函数的功能

该函数的功能有3个:

  1. 如果p,q都存在root的树中,返回公共祖先

  2. 如果p,q存在一个,返回p,q

  3. 如果都不存在,返回NULL

代码:
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root == NULL)
            return NULL;
        if(root == p || root == q)
            return root;
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        TreeNode* right = lowestCommonAncestor(root->right, p, q);

        /* 可省略
        if(left == null && right == null) 
            return null;
        */
        // 如果左边没有p和q中的一个或多个,说明都在右边
        if(left == NULL)
            return right;
        // 同理
        if(right == NULL)
            return left;
        // 都不为空,说明左右各一个,返回root
        return root;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值