#yyds干货盘点# 面试必刷TOP101:在二叉树中找到两个节点的最近公共祖先

Posted 97的风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点# 面试必刷TOP101:在二叉树中找到两个节点的最近公共祖先相关的知识,希望对你有一定的参考价值。

1.简述:

描述

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

数据范围:树上节点数满足  , 节点值val满足区间 [0,n)

要求:时间复杂度 

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

如当输入3,5,1,6,2,0,8,#,#,7,4,5,1时,二叉树3,5,1,6,2,0,8,#,#,7,4如下图所示:

#yyds干货盘点#

所以节点值为5和节点值为1的节点的最近公共祖先节点的节点值为3,所以对应的输出为3。

节点本身可以视为自己的祖先

示例1

输入:

3,5,1,6,2,0,8,#,#,7,4,5,1

返回值:

3

示例2

输入:

3,5,1,6,2,0,8,#,#,7,4,2,7

返回值:

2

2.代码实现:

public class Solution 

public int lowestCommonAncestor(TreeNode root, int o1, int o2)
//记录遍历到的每个节点的父节点。
Map<Integer, Integer> parent = new HashMap<>();
Queue<TreeNode> queue = new LinkedList<>();
parent.put(root.val, Integer.MIN_VALUE);//根节点没有父节点,给他默认一个值
queue.add(root);
//直到两个节点都找到为止。
while (!parent.containsKey(o1) || !parent.containsKey(o2))
//队列是一边进一边出,这里poll方法是出队,
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和他的祖先节点,从o1节点开始一直到根节点。
while (parent.containsKey(o1))
ancestors.add(o1);
o1 = parent.get(o1);

//查看o1和他的祖先节点是否包含o2节点,如果不包含再看是否包含o2的父节点……
while (!ancestors.contains(o2))
o2 = parent.get(o2);
return o2;

以上是关于#yyds干货盘点# 面试必刷TOP101:在二叉树中找到两个节点的最近公共祖先的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# 面试必刷TOP101:求二叉树的层序遍历

#yyds干货盘点# 面试必刷TOP101:二叉树的中序遍历

#yyds干货盘点# 面试必刷TOP101:序列化二叉树

#yyds干货盘点# 面试必刷TOP101:判断是不是平衡二叉树

#yyds干货盘点# 面试必刷TOP101:岛屿数量

#yyds干货盘点# 面试必刷TOP101:反转字符串