牛客刷题二叉树之在二叉树中找到两个节点的最近公共祖先节点

题目描述

给定一棵二叉树以及这棵树上的两个节点 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]
}

注意:
用后序遍历记录当前节点的根节点

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值