#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如下图所示:
所以节点值为5和节点值为1的节点的最近公共祖先节点的节点值为3,所以对应的输出为3。
节点本身可以视为自己的祖先
输入:
3,5,1,6,2,0,8,#,#,7,4,5,1
返回值:
3
输入:
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:二叉树的中序遍历