题解 | #二叉树中找到两个节点的最近公共祖先#dfs/递归
在二叉树中找到两个节点的最近公共祖先
https://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116
func lowestCommonAncestor( root *TreeNode , o1 int , o2 int ) int {
//1. dfs得到根节点到两个target的路径,最后一个同路径节点就是最近公共祖先
// var flag = false
// var dfs func(root *TreeNode, path *[]int, target int )
// dfs = func(root *TreeNode, path *[]int, target int){
// if root==nil || flag ==true{
// return
// }
// *path = append(*path, root.Val)
// if root.Val==target{
// flag = true
// return
// }
// dfs(root.Left, path, target)
// dfs(root.Right, path, target)
// if flag{
// return
// }
// *path = (*path)[:len(*path)-1]
// }
// path1, path2 := []int{}, []int{}
// dfs(root, &path1, o1)
// flag = false
// dfs(root, &path2, o2)
// ans := -1
// for i,j := 0,0;i<len(path1) && j<len(path2);i,j = i+1,j+1{
// if path1[i]==path2[j]{
// ans=path1[i]
// }else{
// break
// }
// }
// return ans
//2.
if root==nil{
return -1
}
if root.Val==o1 || root.Val==o2{//该节点是其中一个o
return root.Val
}
left := lowestCommonAncestor(root.Left, o1, o2) //寻找左子树
right := lowestCommonAncestor(root.Right, o1, o2)//寻找右子树
if left==-1{ //左子树没有,在右子树中
return right
}
if right==-1{//右子树没有,左子树中
return left
}
return root.Val//两边都非空,则当前节点是祖先
}
