美文网首页
算法笔记-go-树

算法笔记-go-树

作者: 浮生尽丶 | 来源:发表于2023-02-07 15:51 被阅读0次

树的话基本都会使用到递归,递归最主要注意返回值和递归条件

如leetcode: https://leetcode.cn/problems/check-balance-lcci/?favorite=xb9lfcwi

实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 1。

算法如下


/**
* Definition for a binary tree node.
* type TreeNode struct {
*     Val int
*     Left *TreeNode
*     Right *TreeNode
* }
*/
func isBalanced(root *TreeNode) bool {

  res := true
  var getAlv func(*TreeNode) float64
  getAlv = func(node *TreeNode) float64 {
      if node == nil {
          return 0
      }
      if node != nil && node.Left == nil && node.Right == nil {
          return 1
      }
      curl := getAlv(node.Left)
      righl := getAlv(node.Right)
      cur := curl - righl
      if cur > 1 || cur < -1 {
          res = false
      }
      return math.Max(curl, righl) + 1
  }
  getAlv(root)
  return res
}

func isBalanced2(root *TreeNode) bool {
  if root == nil {
      return true
  }
  if math.Abs(depth(root.Left)-depth(root.Right)) < 1 {
      return isBalanced2(root.Left) && isBalanced(root.Right)
  }
  return false
}

func depth(root *TreeNode) float64 {
  if root == nil {
      return 0
  }
  return math.Max(depth(root.Left), depth(root.Right)) + 1
}

这里使用了两种方式去解这个题,depth就是递归函数,主要计算深度,isbalance也是递归,判断是否平衡

相关文章

  • go-广度优先算法

    1.迷宫 2.思路 用循环创建二维slice 使用slice来实现队列 用Fscanf读取文件 对Point进行抽...

  • 算法学习

    数据结构学习笔记:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算算法学习笔记浅谈...

  • 决策树学习笔记整理

    决策树学习笔记整理-单身狗那个 学习决策树,老板投资那个 关联分析算法:Apriori ABC 成本法

  • 算法笔记 - 线段树

    线段树的实现比较简单 时间复杂度 O(nlogn) 传统线段树一般用递归实现 线段树可以实现区间数值修改O(log...

  • 算法笔记 - Trie 树

    Trie树是一种非常常见的算法 Trie树的主要用途是快速地匹配字符串 Tire树可以记录数值 Trie树的实现成...

  • 2019-11-18 Vue<点击导航栏滑动到指定位置>