首页 > 编程语言 >每日算法之在二叉树中找到两个节点的最近公共祖先

每日算法之在二叉树中找到两个节点的最近公共祖先

时间:2023-01-07 14:58:02浏览次数:38  
标签:node val parent 节点 算法 二叉树 o2 o1

JZ86 在二叉树中找到两个节点的最近公共祖先

题目

给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。

注:本题保证二叉树中每个节点的val值均不相同。

方法 BFS,非递归方法

思路

算法实现

看到6和7公共祖先有5和3,但最近的是5。我们只要往上找,找到他们第一个相同的公共祖先节点即可,
但怎么找到每个节点的父节点呢,我们只需要把每个节点都遍历一遍,
然后顺便记录他们的父节点存储在Map中。我们先找到其中的一条路径,
比如6→5→3,然后在另一个节点往上找,由于7不在那条路径上,
我们找7的父节点是2,2也不在那条路径上,
我们接着往上找,2的父节点是5,5在那条路径上,所以5就是他们的最近公共子节点。

代码

package mid.JZ86在二叉树中找到两个节点的最近公共祖先;

import java.util.*;

class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
}

public class Solution {
    /**
     * @param root TreeNode类
     * @param o1   int整型
     * @param o2   int整型
     * @return int整型
     */
    public int lowestCommonAncestor(TreeNode root, int o1, int o2) {
        // write code here
        Queue<TreeNode> queue = new LinkedList<>();
        //记录父节点
        Map<Integer, Integer> parent = new HashMap<>();
        parent.put(root.val, Integer.MIN_VALUE);
        queue.add(root);
        //BFS
        while (!parent.containsKey(o1) || !parent.containsKey(o2)) {
            TreeNode node = queue.poll();
            //左子树
            if (node.left != null) {
                //记录父亲节点
                parent.put(node.left.val, node.val);
                queue.add(node.left);
            }
            //左子树
            if (node.right != null) {
                //记录父亲节点
                parent.put(node.right.val, node.val);
                queue.add(node.right);
            }
        }

        //记录祖先节点
        Set<Integer> ancestors = new HashSet<>();
        //列出o1的所有祖先节点
        while (parent.containsKey(o1)) {
            ancestors.add(o1);
            o1 = parent.get(o1);
        }

        while(!ancestors.contains(o2)) {
            o2 = parent.get(o2);
        }
        return o2;
    }
}

标签:node,val,parent,节点,算法,二叉树,o2,o1
From: https://www.cnblogs.com/loongnuts/p/17032618.html

相关文章

  • LeetCode 103_ 二叉树的锯齿形层序遍历
    LeetCode103:二叉树的锯齿形层序遍历题目给你二叉树的根节点root,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进......
  • 简单算法:优先队列
    典型题目题目传送门优先队列对于蒟蒻来说,堆之类的……实在是有点不好理解。所以我们今天只从表面上讲讲什么是优先队列,并且争取做到熟练的运用(知其然不知其所以然)就好......
  • 深度优先与广度优先算法
    一、算法核心深度优先搜索和广度优先搜索,都是图形搜索算法,它两相似,又却不同,在应用上也被用到不同的地方。1)深度优先搜索深度优先搜索属于图算法的一种,是一个针对图和树......
  • 代码随想录算法训练营第10天
    今日刷题2道:先简单复习了栈和队列的理论基础,然后做题:232.用栈实现队列,225.用队列实现栈。ps:昨天不想学习,所以今天补回来,出来混总是要还的啊。● 232.用栈实现队列......
  • 【数据结构与算法】Collection接口&迭代器
    Java合集框架数据结构是以某种形式将数据组织在一起的合集(collection)。数据结构不仅存储数据,还支持访问和处理数据的操作在面向对象的思想里,一种数据结构也被认为是一个容器......
  • 基础算法
    构造排序双指针与扫描线二分倍增分治贪心莫队随机化近似算法......
  • 《随机算法在信息学竞赛中的应用》做题记录
    目录《随机算法在信息学竞赛中的应用》做题记录MSTONESProblemSolutionP3567[POI2014]KUR-CouriersProblemSolutionCF364DGhdProblemSolutionTKCONVEXProblemSolutionP12......
  • 代码随想录算法训练营第10天 | 232. 用栈实现队列 225. 用队列实现栈
    232.用栈实现队列文章:代码随想录(programmercarl.com)思路:使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出栈,这里要注意输入栈......
  • 算法刷题 Day 10 | 232.用栈实现队列 225. 用队列实现栈
    今日任务:理论基础用栈实现队列用队列实现栈理论基础了解一下栈与队列的内部实现机智,文中是以C++为例讲解的。文章讲解:https://programmercarl.com/%E6%A0%......
  • 102. 二叉树的层序遍历
    102.二叉树的层序遍历{学会层序遍历,直接打十个!!}难度中等1542收藏分享切换为英文接收动态反馈给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访......