二叉树的最近公共祖先

leetcode 236、二叉树的最近公共祖先

题目描述

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

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

在这里插入图片描述

题解

思路

  1. 一般情况:目标节点的公共祖先是非目标节点,例如示例1中,这个时候我们可以使用递归,判断当前节点是否是目标节点,如果是目标节点,就返回true,如果不是就返回false,那么这个时候,我们只需要对每个节点的左右子树判断,如果左右子树都返回true,证明该节点就是公共祖先。
  2. 特殊情况:目标节点的公共祖先是目标节点的其中一个。例如下图,那么在这种情况下,不能只对左右子树判断,还要判断当前节点是否是目标节点且左右子树中其中一个是否返回了true。
    在这里插入图片描述

代码

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        getRes(root,p,q);
        return res;
    }

	// 用来存储结果
    private TreeNode res;

    public boolean getRes(TreeNode root, TreeNode p, TreeNode q) {
    	// 递归跳出
        if (root == null) {
            return false;
        }
        // 左子树的返回结果
        boolean leftFlag = getRes(root.left, p, q);
        // 右子树的返回结果
        boolean rightFlag = getRes(root.right, p, q);
        // 如果左右子树都返回true,
        // 或则当前节点是目标节点其中一个且左右子树中有一个返回true,则记录结果
        if ((leftFlag && rightFlag) || ((leftFlag || rightFlag) && (root == p || root == q))){
            res = root;
        }
        // 如果当前节点是目标节点,放回true
        if (root == p || root == q) {
            return true;
        }
        // 返回左右子树中其中一个包含目标节点
        return leftFlag || rightFlag;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值