二叉树中两节点的最低公共祖先

二叉树中两节点的最低公共祖先

要求如下:

给定一个头节点head
和另外两个节点 a b
返回 a 和 b 的最低公共祖先

代码和思路如下:

package beginner.tree;

/**
 * 给定一个头节点head
 * 和另外两个节点 a b
 * 返回 a 和 b 的最低公共祖先
 *
 * @Auther: 苏察哈尔丶灿
 * @Date: 2020/9/28 14:10
 * @Slogan: 我自横刀向天笑,笑完我就去睡觉。
 */
public class LowParentNode {
    // 节点类
    private static class Node {
        public Object val;
        public Node left;
        public Node right;
    }

    // 收集的信息
    private static class Info {
        // 最低公共祖先节点引用
        public Node answer;
        // 是否找到node a
        public boolean findA;
        // 是否找到node b
        public boolean findB;

        public Info(Node answer, boolean findA, boolean findB) {
            this.answer = answer;
            this.findA = findA;
            this.findB = findB;
        }
    }

    public static Info process(Node node, Node nodeA, Node nodeB) {
        // 两种情况
        // 第一种 已经拿到交汇点
        //       当前交汇点等于子树拿到的交汇点,往上返,因为取的是最低
        // 第二种 暂未拿到交汇点
        //       1) 在自己和子树中找到了一个节点,自己不会是交汇点,往上返
        //       2) 在自己和子树中找到了两个节点
        //          1> 自己是两个中的某一个,那么另一个就在自己的子树下,自己就是交汇点,往上返
        //          2> 自己不是两个中的任何一个,自己又包含了两个节点,自己的子节点又没有他们的交汇点
        //             那么自己就是这个交汇点了,获取信息,往上返

        if (node == null) {
            return new Info(null, false, false);
        }

        // 本节点要整理上返的信息
        Node answer = null;
        boolean findA = false;
        boolean findB = false;

        Info leftInfo = process(node.left, nodeA, nodeB);
        Info rightInfo = process(node.right, nodeA, nodeB);

        // 当前节点有咩有找到 A / B
        findA = node == nodeA || leftInfo.findA || rightInfo.findA;
        findB = node == nodeB || leftInfo.findB || rightInfo.findB;

        if (leftInfo.answer != null) {
            answer = leftInfo.answer;
        }

        if (rightInfo.answer != null) {
            answer = rightInfo.answer;
        }

        // 经历了上述过程 子树还是没有找到的话
        // 判断自己有没有 是不是符合
        if (answer == null) {
            if (findA && findB) {
                answer = node;
            }
        }


        return new Info(answer, findA, findB);
    }

    public static void main(String[] args) {
//        如此调用 没写树结构代码...
//        Info info = LowParentNode.process(node, node, node);
//        System.out.println(info.answer);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值