算法笔记-go-树

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

如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也是递归,判断是否平衡

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 关于链表: 关于链表重复或形成环可以通过快慢指针来解决, 如LeetCode 662,997,主要在于如何推导出这...
    浮生尽丶阅读 92评论 0 0
  • 点赞关注,不再迷路,你的支持对我意义重大!🔥 Hi,我是丑丑。本文「数据结构 & 算法」| 导读 —— 登高博见[...
    彭旭锐阅读 2,566评论 0 15
  • 概述 程序 = 算法 + 数据结构 算法是计算机科学的本质,是计算机世界的基石。算法决定了程序如何运行 数据结构决...
    bowen_wu阅读 429评论 0 0
  • 目标一周刷2道题也不知道能坚持几天,这玩意在leetcode做完怎么保存啊 给一个有序的数组,数组中有重复数字,输...
    H丶ym阅读 616评论 0 1
  • 本系列是代码随想录算法训练营的学习笔记之day23,主要记录一下刷题的过程,以及核心知识点和一些值的记录的问题。 ...
    GIS与Climate阅读 106评论 0 0