110. 平衡二叉树

server/2024/9/23 1:34:16/

文章目录

  • 110. 平衡二叉树
    • 题外话
  • 本题思路
    • 递归

110. 平衡二叉树

110. 平衡二叉树

给定一个二叉树,判断它是否是 平衡二叉树

平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:true

示例 2:

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:

输入:root = []
输出:true

提示:

  • 树中的节点数在范围 [0, 5000] 内
  • -10^4 <= Node.val <= 10^4

题外话

咋眼一看这道题目和104. 二叉树的最大深度(包括N叉树的最大深度)很像,其实有很大区别。

这里强调一波概念:

  • 二叉树节点的深度:指从根节点该节点的最长简单路径边的条数。
  • 二叉树节点的高度:指从该节点叶子节点的最长简单路径边的条数。

leetcode中强调的深度和高度很明显是按照节点来计算的,如图:
在这里插入图片描述

关于根节点的深度究竟是1 还是 0,不同的地方有不一样的标准,leetcode的题目中都是以节点为一度,即根节点深度是1。但维基百科上定义用边为一度,即根节点的深度是0,我们暂时以leetcode为准(毕竟要在这上面刷题)。

因为求深度可以从上到下去查 所以需要前序遍历(中左右),而高度只能从下到上去查,所以只能后序遍历(左右中) ,可以理解为深度是从上往下不断增加,而高度是从下往上不断增加。

有的同学一定疑惑,为什么104.二叉树的最大深度 中求的是二叉树的最大深度,也用的是后序遍历。

那是因为代码的逻辑其实是求的根节点的高度,而根节点的高度就是这棵树的最大深度,所以才可以使用后序遍历。如果是求某个中间节点的深度,则使用后序遍历可能会算错,比如上图中节点4的深度是3,如果按后序遍历求高度来算,会得到深度是2(但深度实际是3,高度才是2)

104.二叉树的最大深度 中,如果真正求取二叉树的最大深度,Go代码应该写成如下:(前序遍历)

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func maxDepth(root *TreeNode) int {if root == nil {return 0}// 使用前序遍历,不断更新最大深度的变量值res := 1dfs(root,1,&res)return res
}func dfs(root *TreeNode,depth int,res *int)  {if *res < depth { // 中*res = depth}if root.Left != nil { // 左depth += 1 // 深度+1dfs(root.Left,depth,res)depth -= 1 // 回溯,深度-1}if root.Right != nil { // 右depth += 1 // 深度+1dfs(root.Right,depth,res)depth -= 1 // 回溯,深度-1}}

可以看出使用了前序(中左右)的遍历顺序,这才是真正求深度的逻辑!

注意以上代码是为了把细节体现出来,简化一下代码如下:

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func maxDepth(root *TreeNode) int {if root == nil {return 0}// 使用前序遍历,不断更新最大深度的变量值res := 1dfs(root,1,&res)return res
}func dfs(root *TreeNode,depth int,res *int)  {if *res < depth { // 中*res = depth}if root.Left != nil { // 左dfs(root.Left,depth + 1,res)}if root.Right != nil { // 右dfs(root.Right,depth + 1,res)}}

本题思路

递归

此时大家应该明白了既然要求比较高度,必然是要后序遍历

递归三步曲分析:

  1. 明确递归函数的参数和返回值
    参数:当前传入节点。 返回值:当前节点为根的树是否是平衡二叉树
func isBalanced(root *TreeNode) bool {}
  1. 明确递归终止条件
    递归的过程中依然是遇到空节点了为终止,返回true,表示空节点可以当成平衡二叉树。另一个递归终止条件时,当前树已经明确不是平衡二叉树的时候,没必要继续往后继续递归了,而是应该往上层调用栈回归了。

代码如下:

    if root == nil {return true}// 左右子树高度绝对值相差大于1可以直接返回false了if int(math.Abs(float64(getDepth(root.Left) - getDepth(root.Right)))) > 1 {return false}
  1. 明确单层递归的逻辑
    当前根节点的左子树和右子树均为平衡二叉树

代码如下:

	left := isBalanced(root.Left)  // 左right := isBalanced(root.Right) // 右res := left && right // 根

最后本题整体递归代码如下:

Go代码

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func isBalanced(root *TreeNode) bool {// 以每一个节点作为根节点,判断他的左右子树高度之差是否小于等于1if root == nil {return true}// 左右子树高度绝对值相差大于1可以直接返回false了if int(math.Abs(float64(getDepth(root.Left) - getDepth(root.Right)))) > 1 {return false}left := isBalanced(root.Left)  // 左right := isBalanced(root.Right) // 右res := left && right // 根return res
}// 求二叉树最大深度的模板代码
func getDepth(root *TreeNode) int{if root == nil {return 0}return max(getDepth(root.Left),getDepth(root.Right)) + 1
}func max(a,b int) int {if a > b {return a}return b
}

在这里插入图片描述


http://www.ppmy.cn/server/120562.html

相关文章

Fyne ( go跨平台GUI )中文文档-容器和布局 (四)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

问题——IMX6UL的uboot无法ping主机或Ubuntu

主要描述可能的方向&#xff0c;不涉具体过程&#xff0c;详细操作可以查阅网上相关教程 跟随正点原子教程测试以太网端口时&#xff0c;即便按照步骤多次尝试也无法ping通&#xff0c;后补充了些许网络工程基础知识解决了这个问题。 uboot无法ping主机或Ubuntu有多种可能&…

【Pycharm】Pycharm创建Django提示pip版本需要升级

目录 1、现象 2、分析 3、本质 前言&#xff1a;经常使用pycharm创建django、flask等项目时候提示pip版本需要升级&#xff0c;解决方案 1、现象 使用Pycharm创建Django项目提示安装Django超时&#xff0c;报错建议pip升级22升级到24 2、分析 之前使用命令升级了pip到了24…

了解二八定律,提高工作效率、生活质量

掌握28定律&#xff1a;高效管理时间与资源 前言&#xff1a;今天看到一个概念叫"二八定律",我觉得很适用于我们工作和生活&#xff0c;今天不聊代码&#xff0c;我们来聊聊二八定律。 什么是28定律&#xff1f; 28定律&#xff0c;又称帕累托法则&#xff08;Par…

Golang Beego+Vue打造的高校科研工作管理系统,让信息发布更及时,项目管理更透明

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

[Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

JSON知识

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它是以字符串形式表示数据的结构化格式。JSON 使用一组规则来构建对象和数组&#xff0c;这使其成为一种人类可读的文本格式。 在 Java 中&#xff0c;JSON 通常表现为字符串。…

Webpack 基础使用练习:快速利用场景巩固概念

本篇文章着重来强化对webpack概念的了解&#xff0c;同时提供一些特定的场景来告诉大家应该什么时候使用什么配置来解决什么问题&#xff0c;好的&#xff0c;废话不多说&#xff0c;我们开始啦&#xff01; 基础安装 npm install -D webpack webpack-cli初始文件 module.ex…