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;
    }
}
相关推荐
人大博士的交易之路12 分钟前
数据结构算法——python数据结构
开发语言·数据结构·python
stolentime42 分钟前
通信题:洛谷P15942 [JOI Final 2026] 赌场 / Casino题解
c++·算法·洛谷·joi·通信题
初生牛犊不怕苦1 小时前
与AI一起学习《C专家编程》:数组与指针
c语言·学习·算法
Kk.08021 小时前
数据结构|排序算法(二) 冒泡排序
数据结构·算法·排序算法
沛沛rh451 小时前
深入并发编程:从 C++ 到 Rust 的学习笔记
c++·笔记·学习·算法·rust
Kk.08022 小时前
数据结构|排序算法(二) 希尔排序
数据结构·算法·排序算法
AI医影跨模态组学2 小时前
NPJ Precis Oncol(IF=8)复旦大学肿瘤医院等团队:基于生境CT放射组学解析可切除非小细胞肺癌时空异质性预测新辅助化疗免疫治疗病理反应
大数据·人工智能·算法·医学·医学影像
Book思议-2 小时前
二叉树的递归遍历详解:前序、中序与后序
数据结构·算法·二叉树的递归遍历-前中后序
Demon--hx2 小时前
[LeetCode]100 链表-专题
算法·leetcode·链表