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

[复制链接]
发表于 2023-1-7 14:02:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

题目
  1. 给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
  2. 注:本题保证二叉树中每个节点的val值均不相同。
复制代码
方法 BFS,非递归方法

思路

算法实现
  1. 看到6和7公共祖先有5和3,但最近的是5。我们只要往上找,找到他们第一个相同的公共祖先节点即可,
  2. 但怎么找到每个节点的父节点呢,我们只需要把每个节点都遍历一遍,
  3. 然后顺便记录他们的父节点存储在Map中。我们先找到其中的一条路径,
  4. 比如6→5→3,然后在另一个节点往上找,由于7不在那条路径上,
  5. 我们找7的父节点是2,2也不在那条路径上,
  6. 我们接着往上找,2的父节点是5,5在那条路径上,所以5就是他们的最近公共子节点。
复制代码
代码
  1. package mid.JZ86在二叉树中找到两个节点的最近公共祖先;
  2. import java.util.*;
  3. class TreeNode {
  4.     int val = 0;
  5.     TreeNode left = null;
  6.     TreeNode right = null;
  7. }
  8. public class Solution {
  9.     /**
  10.      * @param root TreeNode类
  11.      * @param o1   int整型
  12.      * @param o2   int整型
  13.      * @return int整型
  14.      */
  15.     public int lowestCommonAncestor(TreeNode root, int o1, int o2) {
  16.         // write code here
  17.         Queue<TreeNode> queue = new LinkedList<>();
  18.         //记录父节点
  19.         Map<Integer, Integer> parent = new HashMap<>();
  20.         parent.put(root.val, Integer.MIN_VALUE);
  21.         queue.add(root);
  22.         //BFS
  23.         while (!parent.containsKey(o1) || !parent.containsKey(o2)) {
  24.             TreeNode node = queue.poll();
  25.             //左子树
  26.             if (node.left != null) {
  27.                 //记录父亲节点
  28.                 parent.put(node.left.val, node.val);
  29.                 queue.add(node.left);
  30.             }
  31.             //左子树
  32.             if (node.right != null) {
  33.                 //记录父亲节点
  34.                 parent.put(node.right.val, node.val);
  35.                 queue.add(node.right);
  36.             }
  37.         }
  38.         //记录祖先节点
  39.         Set<Integer> ancestors = new HashSet<>();
  40.         //列出o1的所有祖先节点
  41.         while (parent.containsKey(o1)) {
  42.             ancestors.add(o1);
  43.             o1 = parent.get(o1);
  44.         }
  45.         while(!ancestors.contains(o2)) {
  46.             o2 = parent.get(o2);
  47.         }
  48.         return o2;
  49.     }
  50. }
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表