二叉树的最近公共祖先

给出一个root节点,p节点,q节点;


1.祖先的定义:节点root的左子树中含有p节点,右子树中含有q节点,则root为p和q的祖先;

2:最近公共祖先:root的左,右子树中不含有p,q的最近公共祖先;

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

那么p,q的最近公共祖先root可有以下几种情况

1:p,q存在于root的子树中且位于异侧(左右子树);

2:p或q本身就为最近公共祖先;(该点容易忽略);

p为最近公共祖先时q位于p的左右子树中的一侧;

q为最近公共祖先时,同理;

最重要的一点是我们需要自顶向上的遍历顺序以便判断是否为公共祖先;即为后序遍历;

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (root==p||root==q||root==NULL) return root;当遇到节点p或q时返回;当节点为空时返回
        
        TreeNode*left=lowestCommonAncestor(root->left,p,q);  记录节点左子树是否含有目的节点

        TreeNode*right=lowestCommonAncestor(root->right,p,q);  记录几点右子树是否含有目的节点

        if(!left&&!right)return NULL;    节点左子树和右子树中都不含有目的节点p,q则返回NULL;
        
        else if(!left)return right; 节点左子树为空右子树不为空,返回右子树结果
                                    此时有两种情况 1:节点右子树的根结点为p(p为q和q的最近公共祖 
                                    先
                                    2:节点右子树的根节点为p和q的最近公共祖先,p,q位于根节点的 
                                     两侧

        else if(!right)return left;

        else return root;
    }

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值