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;
    }
}
相关推荐
杨福瑞6 分钟前
数据结构:单链表(2)
c语言·开发语言·数据结构
王璐WL1 小时前
【数据结构】单链表及单链表的实现
数据结构
黑屋里的马1 小时前
java的设计模式之桥接模式(Bridge)
java·算法·桥接模式
z187461030031 小时前
list(带头双向循环链表)
数据结构·c++·链表
sin_hielo2 小时前
leetcode 1611
算法·leetcode
李小白杂货铺2 小时前
识别和破除信息茧房
算法·信息茧房·识别信息茧房·破除信息茧房·算法推荐型茧房·观点过滤型茧房·茧房
来荔枝一大筐2 小时前
C++ LeetCode 力扣刷题 541. 反转字符串 II
c++·算法·leetcode
T.Ree.3 小时前
cpp_list
开发语言·数据结构·c++·list
暴风鱼划水3 小时前
算法题(Python)数组篇 | 6.区间和
python·算法·数组·区间和
童话ing3 小时前
【Golang】常见数据结构原理剖析
数据结构·golang