算法训练营day18, 二叉树7

文章介绍了如何使用递归方法在二叉搜索树中找到最小绝对差、查找众数以及求解最近公共祖先。通过实例展示了`getMinimumDifference`、`findMode`和`lowestCommonAncestor`三个函数的实现。
摘要由CSDN通过智能技术生成

import "math"

type TreeNode struct {

  Val   int

  Left  *TreeNode

  Right *TreeNode

}

530. 二叉搜索树的最小绝对差

func getMinimumDifference(root *TreeNode) int {

  //初始一个最大值

  result := math.MaxInt64

  var prev *TreeNode

  //同样也要内部封装一个递归函数

  var treeTraversal func(tree *TreeNode)

  treeTraversal = func(tree *TreeNode) {

    if tree == nil {

      return

    }

    treeTraversal(tree.Left)

    //如果前一个节点不为空,且当前节点值与上一个节点值差小于result,则把这个差值赋给result

    if prev != nil && tree.Val-prev.Val < result {

      result = tree.Val - prev.Val

    }

    prev = tree

    treeTraversal(tree.Right)

  }

  treeTraversal(root)

  return result

}


501. 二叉搜索树中的众数

func findMode(root *TreeNode) []int {

  //设置返回数组为空

  result := []int{}

  //统计出现次数

  count := 1

  //最大次数

  maxCount := 1

  var prev *TreeNode

  //同样还是要内部创建递归函数

  var traversal func(tree *TreeNode)

  traversal = func(tree *TreeNode) {

    if tree == nil {

      return

    }

    traversal(tree.Left)

    //如果上一个节点值与当前节点值相等,count累计加1,不相等则重新从1计算

    if prev != nil && tree.Val == prev.Val {

      count++

    } else {

      count = 1

    }

    if count >= maxCount {

      //如果统计次数大于最大统计,则把result数组清空并把当前值赋给数组result,否则result增加一个值

      if count > maxCount {

        result = []int{tree.Val}

      } else {

        result = append(result, tree.Val)

      }

      maxCount = count

    }

    prev = tree

    traversal(tree.Right)

  }

  traversal(root)

  return result

}

236. 二叉树的最近公共祖先

func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {

  if root == nil || root == p || root == q {

    return root

  }

  //后序遍历左右中

  left := lowestCommonAncestor(root.Left, p, q)

  right := lowestCommonAncestor(root.Right, p, q)

  if left != nil && right != nil {

    return root

  } else if left == nil && right != nil {

    return right

  } else if left != nil && right == nil {

    return left

  } else {

    return nil

  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值