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);
    }
}