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


    目录
    相关文章
    |
    4月前
    【LeetCode 31】104.二叉树的最大深度
    【LeetCode 31】104.二叉树的最大深度
    39 2
    |
    4月前
    【LeetCode 29】226.反转二叉树
    【LeetCode 29】226.反转二叉树
    36 2
    |
    4月前
    【LeetCode 28】102.二叉树的层序遍历
    【LeetCode 28】102.二叉树的层序遍历
    27 2
    |
    3月前
    |
    算法 Java
    JAVA 二叉树面试题
    JAVA 二叉树面试题
    35 0
    |
    4月前
    【LeetCode 43】236.二叉树的最近公共祖先
    【LeetCode 43】236.二叉树的最近公共祖先
    33 0
    |
    4月前
    【LeetCode 38】617.合并二叉树
    【LeetCode 38】617.合并二叉树
    30 0
    |
    4月前
    【LeetCode 37】106.从中序与后序遍历构造二叉树
    【LeetCode 37】106.从中序与后序遍历构造二叉树
    33 0
    |
    4月前
    【LeetCode 34】257.二叉树的所有路径
    【LeetCode 34】257.二叉树的所有路径
    38 0
    |
    4月前
    【LeetCode 32】111.二叉树的最小深度
    【LeetCode 32】111.二叉树的最小深度
    29 0
    |
    3天前
    |
    Java 程序员 开发者
    Java社招面试题:一个线程运行时发生异常会怎样?
    大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
    38 14