剑指offer解法汇总86-在二叉树中找到两个节点的最近公共祖先

该博客介绍了如何在给定的非空二叉树中,使用O(n)的时间复杂度和O(1)的空间复杂度找到两个指定节点的最近公共祖先。通过递归的方式,首先检查当前节点是否是目标节点,然后分别在左子树和右子树中查找,最后根据节点的存在情况确定最近公共祖先。提供的代码展示了具体的实现细节。
摘要由CSDN通过智能技术生成

 原题链接:在二叉树中找到两个节点的最近公共祖先_牛客题霸_牛客网


描述:

给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。

数据范围:1 \le n \le 10001≤n≤1000,树上每个节点的val满足 0<val \le 1000<val≤100

要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

注:本题保证二叉树中每个节点的val值均不相同。

如当输入[3,5,1,6,2,0,8,#,#,7,4],5,1时,二叉树{3,5,1,6,2,0,8,#,#,7,4}如下图所示:

所以节点值为5和节点值为1的节点的最近公共祖先节点的节点值为3,所以对应的输出为3。

解题思路:

动态规划的思路,

1.判断当前节点是否时o1,o2节点,如果时则返回当前节点。

2.判断o1,o2值是否在左侧节点中,如果在则返回左侧节点。

3.右侧同2

4.如果左右侧节点都不为空,则说明当前节点就是最近公共祖先,返回。

5.如果只是左侧节点不为空,那么返回左侧节点(这个左侧节点就是o1或者o2节点)

6.右侧节点逻辑同5

7.左右都为空则返回null。说明当前节点不包含o1,o2节点

代码:

public int lowestCommonAncestor(TreeNode root, int o1, int o2) {
        // write code here
        TreeNode node = findNode(root, o1, o2);

        return node.val;
    }

    public TreeNode findNode(TreeNode root, int o1, int o2) {
        if (root.val == o1 || root.val == o2) {
            return root;
        }
        TreeNode node1 = null;
        TreeNode node2 = null;
        if (root.left != null) {
            node1 = findNode(root.left, o1, o2);
        }
        if (root.right != null) {
            node2 = findNode(root.right, o1, o2);
        }
        if (node1 != null && node2 != null) {
            return root;
        }
        if (node1 != null) {
            return node1;
        }
        if (node2 != null) {
            return node2;
        }
        return null;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失落夏天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值