一对比我就是个废物
思路:
1、构建父子节点关系 map
2、构建 o1 父节点 集合 set
3、o2的父节点是否在集合set中

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    //o1所在节点
    private TreeNode n1;
    //o2所在节点
    private TreeNode n2;
    //key = subNode ; value=parentNode
    //子节点与父节点关系的map
    private Map<TreeNode,TreeNode> map = new HashMap<>();
    //n1所有的父节点集合
    private Set<TreeNode> set = new HashSet<>();
    /**
     * 
     * @param root TreeNode类 
     * @param o1 int整型 
     * @param o2 int整型 
     * @return int整型
     */
    public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
        //构造子节点与父节点关系的map
        map.put(root,null);
        createMap(root,o1,o2);

        //构造n1所有的父节点
        set.add(n1);
        while(map.get(n1)!=null){
            set.add(map.get(n1));
            n1 = map.get(n1);
        }
        //查找n2自身以及父节点是否是n1父节点中的一个
        if(set.contains(n2)){
            return n2.val;
        }
        while(map.get(n2)!=null){
            if(set.contains(map.get(n2))){
                return map.get(n2).val;
            }
            n2 = map.get(n2);
        }
        //返回根结点
        return root.val;


    }
    public void createMap(TreeNode root, int o1, int o2){
        if(root==null) return;
        if(root.val==o1) n1 = root;
        if(root.val==o2) n2 = root;
        if(root.left!=null){
            map.put(root.left,root);
            createMap(root.left,o1,o2);
        }
        if(root.right!=null){
            map.put(root.right,root);
            createMap(root.right,o1,o2);
        }

    }


}