当前位置: 首页 > news >正文

剑指 Offer 55 - II. 平衡二叉树

剑指 Offer 55 - II. 平衡二叉树

难度:easy\color{Green}{easy}easy


题目描述

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

示例 1:

给定二叉树 [3,9,20,null,null,15,7][3,9,20,null,null,15,7][3,9,20,null,null,15,7]

    3/ \9  20/  \15   7

返回 truetruetrue

示例 2:

给定二叉树 [1,2,2,3,3,null,null,4,4][1,2,2,3,3,null,null,4,4][1,2,2,3,3,null,null,4,4]

       1/ \2   2/ \3   3/ \4   4

返回 falsefalsefalse

限制:

  • 0<=树的结点个数<=100000 <= 树的结点个数 <= 100000<=树的结点个数<=10000

注意:本题与主站 110 题相同:https://leetcode-cn.com/problems/balanced-binary-tree/


算法

(递归)

递归判断:

先递归判断两棵子树是否是平衡的,递归的过程中记录每棵树的最大深度值,然后判断两棵子树的最大深度的差是否不大于1。

复杂度分析

  • 时间复杂度:每个节点仅被遍历一次,且判断的复杂度是 O(1)O(1)O(1)。所以总时间复杂度是O(n)O(n)O(n)

  • 空间复杂度 : O(n)O(n)O(n)

C++ 代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:bool ans;bool isBalanced(TreeNode* root) {ans = true;dfs(root);return ans;}int dfs(TreeNode* root) {if (!root) return 0;int lh = dfs(root->left), rh = dfs(root->right);if (abs(lh - rh) > 1) ans = false;return max(lh, rh) + 1;}
};

算法2

构造一个获取当前子树的深度的函数 maxdepth(root) ,通过比较某子树的左右子树的深度差 abs(maxdepth(root.left) - maxdepth(root.right)) <= 1 是否成立,来判断某子树是否是二叉平衡树。若所有子树都平衡,则此树平衡。

C++ 代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:int maxDepth(TreeNode* root) {if (!root) return 0;return max(maxDepth(root->left), maxDepth(root->right)) + 1;}bool isBalanced(TreeNode* root) {if (!root) return true;int left = maxDepth(root->left);int right = maxDepth(root->right);return abs(left - right) <= 1 && isBalanced(root->left) && isBalanced(root->right);}
};
http://www.lryc.cn/news/31758.html

相关文章:

  • 一文吃透前端低代码的 “神仙生活”
  • 【深度学习】预训练语言模型-BERT
  • C++类的组合
  • 2.伪随机数生成器(ctr_drbg)的配置与使用
  • CentOS7 切换图形模式和多用户命令行模式
  • 在linux上用SDKMan对Java进行多版本管理
  • JSONObject、fastJson(JsonObject)、Gson(JsonObject)区别
  • 如何在CSDN中使用ChatGPT
  • 【Spring6】| GoF之工厂模式
  • 初识Node.js
  • C51---软件消抖
  • redis数据持久化
  • Java StringBuffer类
  • 电路模型和电路定律(2)——“电路分析”
  • 天琊超级进程监视器的应用试验(19)
  • 使用 Pulumi 打造自己的多云管理平台
  • 什么是MyBatis?无论是基础教学还是技术精进,你都应该看这篇MyBatis
  • 【编程基础之Python】10、Python中的运算符
  • Android的基础介绍
  • 用户登录请求100w/每天, JVM如何调优
  • C/C++每日一练(20230306)
  • 多线程的创建、Thread类、线程安全、同步、通信
  • GraphPad Prism v9.5.1.733 科研绘图软件多语言
  • 基于intel soc+fpga智能驾驶舱和高级驾驶辅助系统软件设计(三)
  • 什么?年终奖多发1块钱竟要多缴9.6W的税
  • 动态绑定右键菜单控件
  • JavaScript基础三、数据类型
  • Python 随机漫步
  • Spark SQL优化机制
  • 十五、Spring中的八大模式