【牛客】BM38在二叉树中找到两个节点的最近公共祖先

AI摘要:

描述

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

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

要求:时间复杂度 O*(*n)

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

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

img

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

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

示例1

1
2
3
4
输入:
{3,5,1,6,2,0,8,#,#,7,4},5,1
返回值:
3

示例2

1
2
3
4
输入:
{3,5,1,6,2,0,8,#,#,7,4},2,7
返回值:
2

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
// list记录搜索路径
ArrayList<Integer> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
find(root, o1, list1);
find(root, o2, list2);

int ps = root.val;
int n = Math.min(list1.size(), list2.size());
for(int i=0; i<n; i++){
//System.out.println(i+" | "+list1.get(i)+" | "+list2.get(i));
//这里的 equals 不能用 ==
if(list1.get(i).equals(list2.get(i))){
ps = list1.get(i);
}else{
break;
}
}
return ps;
}

public boolean find(TreeNode node, int o, ArrayList<Integer> list){
list.add(node.val);
if(node.val == o){
return true;
}
if(node.left != null && find(node.left, o, list)){
return true;
}
if(node.right != null && find(node.right, o, list)){
return true;
}

list.remove(list.size()-1);
return false;
}

【牛客】BM38在二叉树中找到两个节点的最近公共祖先
https://blog.cngo.rr.nu/posts/36e2.html
作者
cngo
发布于
2024年8月25日
许可协议