236. 二叉树的最近公共祖先 --力扣 --JAVA

题目

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

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

解题思路

  1. 利用Map存储当前节点和对应的子节点;
  2. 利用递归遍历整棵树,将数据存放到Map当中;
  3. 遍历Map获取最近的公共祖先。

代码展示

java 复制代码
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        Map<TreeNode, List<Integer>> data = new HashMap<>();
        dfs(root,data);
        int min = Integer.MAX_VALUE;
        TreeNode ans = null;
        for (TreeNode treeNode : data.keySet()){
            List<Integer> list = data.get(treeNode);
            int size = list.size();
            if(list.contains(p.val) && list.contains(q.val)){
                if(min > size){
                    min = size;
                    ans = treeNode;
                }
            }
        }
        return ans;
    }
    public List<Integer> dfs(TreeNode root, Map<TreeNode, List<Integer>> data){
        if(root == null){
            return new ArrayList<>();
        }
        List<Integer> store = new ArrayList<>();
        store.add(root.val);
        store.addAll(dfs(root.left,data));
        store.addAll(dfs(root.right,data));
        data.putIfAbsent(root, store);
        return store;
    }
}
相关推荐
深圳满意度咨询1 小时前
医院满意度数字化测评系统:从数据采集到智能决策的技术实践
算法
xiangyun612 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun612 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
OKkankan3 小时前
LangChain 能力详解!:输出解析、RAG、向量数据库与 Retriever 检索器
数据结构·python·langchain·ai应用
蓝速科技3 小时前
便民服务大厅 AI 数字人一体机场景适配与落地指南丨蓝速科技
大数据·网络·数据结构·人工智能·自然语言处理·数据分析·运维开发
302wanger4 小时前
推荐下我的两个AI信息源
算法
索尔~古德曼4 小时前
CF——错题的集合
算法
xxwxx__4 小时前
C++ AVL 树深度剖析:平衡二叉搜索树原理、源码与面试考点
数据结构·c++
SL_staff4 小时前
JVS-Logic:从页面配置工具到企业级业务逻辑中枢的技术演进
java·算法·全栈
Logic1014 小时前
C语言/数据结构数组题解:数字列表加一(Plus One)——进位处理与数组扩展
c语言·数据结构·模拟·数组·时间复杂度·算法题·进位