236. 二叉树的最近公共祖先

复制代码
https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/?envType=study-plan-v2&envId=top-interview-150
复制代码
思路:因为自己可以是自己的祖先,所以这题其实是在问哪棵子树(最小)可以同时将两个节点包含,我们需要返回该子树的根节点;因为没有重复数所以我们可以用cnt来记录以当前节点为根的子树包含这两个节点的数量,我们可以用cnt=当前节点本身是否相等+左右子树包含的数量, 就可以算出当前节点为根的子树包含这两个节点的数量,当第一次等于2的时候就代表我们找到了。
java 复制代码
public class Main {
    int cnt = 0;
    TreeNode goal = null;
    boolean flag = false;
    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode() {
        }

        TreeNode(int val) {
            this.val = val;
        }

        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        method(root, p, q);
        return goal;
    }

    public int method(TreeNode node, TreeNode p, TreeNode q) {
        if (node == null) {
            return 0;
        }
        //当前节点为根的子树包含这两个节点的数量
        int cnt = ((node.val == p.val || node.val == q.val) ? 1 : 0) + method(node.left, p, q) + method(node.right, p, q);
        // 第一次等于2,我们记录一下根节点,后续不再进入该部分
        if (cnt == 2 && !flag) {
            goal = node;
            flag = true;
        }
        return cnt;
    }
}
相关推荐
fish_xk3 分钟前
map和set
java·开发语言
李崧正17 分钟前
Java技术分享:Lambda表达式与函数式编程
java·开发语言·python
老了,不知天命20 分钟前
鳶尾花項目JAVA
java·开发语言·机器学习
二哈赛车手26 分钟前
新人笔记---实现简易版的rag的bm25检索(利用ES),以及RAG上传时的ES与向量数据库双写
java·数据库·笔记·spring·elasticsearch·ai
winner888129 分钟前
从零吃透C++命名空间、std、#include、string、vector
java·开发语言·c++
AI人工智能+电脑小能手37 分钟前
【大白话说Java面试题】【Java基础篇】第26题:Java的抽象类和接口有哪些区别
java·开发语言·面试
bzmK1DTbd1 小时前
SOLID原则在Java中的实践:单一职责与开闭原则
java·开发语言·开闭原则
winner88811 小时前
C++ 命名空间、虚函数、抽象类、protected 权限全套通俗易懂精讲(附与 Java 对比)
java·开发语言·c++
直奔標竿1 小时前
Java开发者AI转型第二十五课!Spring AI 个人知识库实战(四)——RAG来源追溯落地,拒绝AI幻觉
java·开发语言·人工智能·spring boot·后端·spring
代码中介商1 小时前
数据结构开篇:从问题到解决方案
数据结构