var pTrace [](*TreeNode)
var qTrace [](*TreeNode)
func getTrace(root, k *TreeNode, trace [](*TreeNode), flag bool){
if root == nil || flag && len(pTrace) != 0 || !flag && len(qTrace) != 0{ // 这个方向找不到了
return
}
if root.Val == k.Val{
trace = append(trace, root)
if flag {
pTrace = trace
}else{
qTrace = trace
}
return
}
trace = append(trace, root)
getTrace(root.Left, k, trace, flag)
getTrace(root.Right, k, trace, flag)
}
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
pTrace = []*TreeNode{}
qTrace = []*TreeNode{}
getTrace(root, p, [](*TreeNode){}, true)
getTrace(root, q, [](*TreeNode){}, false)
var i, j int
for i < len(pTrace) && j < len(qTrace){
if pTrace[i] != qTrace[j]{
return pTrace[i-1]
}
i ++
j ++
}
if i == len(pTrace){
return pTrace[len(pTrace)-1]
}else{
return qTrace[len(qTrace)-1]
}
}
分别找到两个节点的所有祖先节点,也就得到两个节点list,两个list分别从前往后遍历,直到遍历到不一样的元素,之前的那个元素就是两个节点的公共祖先