package main
import (
    "math"
)
/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */

/**
 * 
 * @param root TreeNode类 
 * @param o1 int整型 
 * @param o2 int整型 
 * @return int整型
*/
func lowestCommonAncestor( root *TreeNode ,  o1 int ,  o2 int ) int {
    node := root
    num1, num2 := o1, o2
	if node == nil {
		return -1
	}
	parent := make(map[int]int, 0)
	floor := make([]*TreeNode, 0)
	floor = append(floor, node)
	//【重点】记录根节点
	parent[node.Val] = math.MinInt
	//层序遍历
	for len(floor) != 0 {
		size := len(floor)
		tmp := make([]*TreeNode, 0)
		for i := 0; i < size; i++ {
			curr := floor[0]
			floor = floor[1:]
			if curr.Left != nil {
				parent[curr.Left.Val] = curr.Val
				tmp = append(tmp, curr.Left)
			}
			if curr.Right != nil {
				parent[curr.Right.Val] = curr.Val
				tmp = append(tmp, curr.Right)
			}
		}
		floor = tmp
	}
	//从map获取num1所有父节点的路径
	ancestor := make(map[int]int, 0)
	for _, ok := parent[num1]; ok; num1, ok = parent[num1] {
		ancestor[num1] = num1
	}
	//计算最近的公共父节点:ancestor中不包含这个num2的父节点,则继续向上遍历parent中num2的父节点,肯定有一个是符合的
	var res int
	var ok bool
	for res, ok = ancestor[num2]; !ok; res, ok = ancestor[num2] {
		num2 = parent[num2]
	}
	return res
}