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


    目录
    相关文章
    |
    1月前
    【LeetCode 31】104.二叉树的最大深度
    【LeetCode 31】104.二叉树的最大深度
    20 2
    |
    1月前
    【LeetCode 29】226.反转二叉树
    【LeetCode 29】226.反转二叉树
    16 2
    |
    1月前
    【LeetCode 28】102.二叉树的层序遍历
    【LeetCode 28】102.二叉树的层序遍历
    16 2
    |
    25天前
    |
    算法 Java
    JAVA 二叉树面试题
    JAVA 二叉树面试题
    14 0
    |
    1月前
    【LeetCode 43】236.二叉树的最近公共祖先
    【LeetCode 43】236.二叉树的最近公共祖先
    19 0
    |
    1月前
    【LeetCode 38】617.合并二叉树
    【LeetCode 38】617.合并二叉树
    14 0
    |
    1月前
    【LeetCode 37】106.从中序与后序遍历构造二叉树
    【LeetCode 37】106.从中序与后序遍历构造二叉树
    17 0
    |
    1月前
    【LeetCode 34】257.二叉树的所有路径
    【LeetCode 34】257.二叉树的所有路径
    17 0
    |
    1月前
    【LeetCode 32】111.二叉树的最小深度
    【LeetCode 32】111.二叉树的最小深度
    16 0
    |
    5天前
    |
    Java 开发者
    Java多线程编程中的常见误区与最佳实践####
    本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
    下一篇
    无影云桌面