import java.util.*;
public class Solution {
// 给定一颗二叉树找到对应两个节点的最近公共祖先
// 要使用路径记录的话,需要用到回溯的方法,回溯就是出栈
public boolean flag = false;
public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
// write code here
ArrayList<Integer> path1 = new ArrayList<>();
ArrayList<Integer> path2 = new ArrayList<>();
dfs(root,path1,o1);
// 重置flag,查找下一个
flag = false;
dfs(root,path2,o2);
int res = 0;
// 比较两条路径,找到第一个不同的点
for(int i = 0;i<path1.size() && i<path2.size();i++){
int x = path1.get(i);
int y = path2.get(i);
if(x == y){
res = x;
}else{
break;
}
}
return res;
}
public void dfs(TreeNode root, ArrayList<Integer> path, int o){
if(flag || root == null){
return ;
}
// 因为都是从最开始的root开始的,所以先直接将root加入路径记录
path.add(root.val);
// 因为节点值都不同,可以直接用值比较
if(root.val == o){
flag = true;
return;
}
dfs(root.left,path,o);
dfs(root.right,path,o);
// 找到之后,表示当前list中记录的节点都是正确的,不需要执行后续的回溯操作
if(flag) return;
// 回溯一位,移除掉列表最后一个元素
path.remove(path.size() - 1);
}
}