题目描述
给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
牛客链接:
https://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116?tpId=117&&tqId=35027&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking
解题思路:
用两种方式,递归和非递归
代码一:
递归方式
package main
func lowestCommonAncestor( root *TreeNode , o1 int , o2 int ) int {
if root==nil {
return -1
}
if o1==root.Val || o2==root.Val {
return root.Val
}
left := lowestCommonAncestor(root.Left, o1, o2)
right := lowestCommonAncestor(root.Right, o1, o2)
if left!=-1 && right!=-1 {
return root.Val
} else if left!=-1 {
return left
} else if right!=-1 {
return right
} else {
return -1
}
}
代码二:
非递归方式
package main
func lowestCommonAncestor( root *TreeNode , o1 int , o2 int ) int {
if root==nil {
return -1
}
var stk []*TreeNode
var nums1 []int
var nums2 []int
temp := root
pre := root
pre = nil
flag1 := false
flag2 := false
for len(stk)!=0 || temp!=nil {
if temp!=nil {
stk = append(stk, temp)
nums1 = append(nums1, temp.Val)
nums2 = append(nums2, temp.Val)
temp = temp.Left
} else {
if stk[len(stk)-1].Right==nil || stk[len(stk)-1].Right==pre {
pre = stk[len(stk)-1]
stk = stk[:len(stk)-1]
if pre.Val==o1 {
flag1 = true
}
if pre.Val==o2 {
flag2 = true
}
if !flag1 {
nums1 = nums1[:len(nums1)-1]
}
if !flag2 {
nums2 = nums2[:len(nums2)-1]
}
} else {
temp = stk[len(stk)-1].Right
}
}
}
if !flag1 || !flag2 {
return -1
}
count1 := 0
count2 := 0
for count1<len(nums1) && count2<len(nums2) {
if nums1[count1]!=nums2[count2] {
break
}
count1++
count2++
}
return nums1[count1-1]
}
注意:
用后序遍历记录当前节点的根节点