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

简介: ​给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”​

 题目

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

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

解题思路

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

    代码展示

    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;
        }
    }

    image.gif


    目录
    相关文章
    |
    2月前
    |
    存储 算法
    二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
    文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
    二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
    |
    2月前
    |
    算法 Java
    LeetCode第94题二叉树的中序遍历
    文章介绍了LeetCode第94题"二叉树的中序遍历"的解法,使用递归实现了中序遍历的过程,遵循了"左根右"的遍历顺序,并提供了清晰的Java代码实现。
    LeetCode第94题二叉树的中序遍历
    |
    2月前
    |
    算法 Java
    LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
    LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
    39 6
    |
    2月前
    |
    存储 算法 Java
    LeetCode经典算法题:打家劫舍java详解
    LeetCode经典算法题:打家劫舍java详解
    55 2
    |
    2月前
    |
    人工智能 算法 Java
    LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
    LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
    41 1
    |
    2月前
    |
    存储 算法 Java
    LeetCode经典算法题:预测赢家+香槟塔java解法
    LeetCode经典算法题:预测赢家+香槟塔java解法
    40 1
    |
    2月前
    |
    存储 算法 Java
    LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
    LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
    65 0
    |
    6天前
    |
    Unix Shell Linux
    LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
    本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
    LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
    |
    2月前
    |
    Python
    【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
    本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
    45 6
    |
    2月前
    |
    搜索推荐 索引 Python
    【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
    本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
    82 2
    下一篇
    无影云桌面