判断平衡二叉树与翻转二叉树——每日练习

目录

1、是否是平衡二叉树

初阶实现

分析

时空复杂度

进阶实现

分析

时空复杂度 

总结 

2、翻转二叉树

分析

时空复杂度 


1、是否是平衡二叉树

110. 平衡二叉树 - 力扣(LeetCode)

初阶实现

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
int height(struct TreeNode* root) {if (root == NULL) {return 0;} else {return fmax(height(root->left), height(root->right)) + 1;}
}bool isBalanced(struct TreeNode* root) {if (root == NULL) {return true;} else{//递归祖先结点的整个左子树的左右子树并计算整个左子树的深度、以及整个右子树的左右子树并计算整个左右子树的深度//由于一颗二叉树是平衡二叉树,则它的所有子树也都是平衡二叉树return fabs(height(root->left) - height(root->right)) <= 1 && isBalanced(root->left) && isBalanced(root->right);}
}

分析

        首先要知道的是,一颗树是否为平衡二叉树在于它的左右子树的高度查是否为1,我们首先利用递归宏观的计算整棵树的左子树和右子树的高度差,height函数中fmax函数的作用就是选出当前结点的左右子树的最大深度,然后加一得到当前结点及其左右子树的整体高度,然后将该高度返回,fabs函数计算的是整棵树左右子树的高度差的绝对值,如果该绝对值小于等于1那么宏观上看该树是一颗平衡二叉树,但是微观上我们无法保证,所以在使用fabs函数后还需要递归判断整棵树的左右子树是否是一颗平衡二叉树,它们的子树是否是一颗平衡二叉树......(平衡二叉树的所有子树均为平衡二叉树)

时空复杂度

时间复杂度:O(N^2)(n是二叉树中的节点个数,且二叉树为链式结构(一条线),高度为n,n*n)

空间复杂度:O(N)( n是二叉树中的节点个数,空间复杂度主要取决于递归调用的层数,递归调用的层数不会超过n)

进阶实现

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/int height(struct TreeNode* root) {if (root == NULL) {return 0;}int leftHeight = height(root->left);int rightHeight = height(root->right);if (leftHeight == -1 || rightHeight == -1 || fabs(leftHeight - rightHeight) > 1) {return -1;} else {return fmax(leftHeight, rightHeight) + 1;}
}
//因为自底向上的判断过程中,如果某一节点不满足平衡条件,那么该节点向上层父节点返回-1,上层结点如果发现自己的左右结点有一个为-1,就表示它知道这棵树不是平衡二叉树,自己也就不再判断而直接再次向自己的上层结点返回-1,所以最后根结点直接判断是不是大于零就行,因为如果不是平衡二叉树最后根节点会返回-1.bool isBalanced(struct TreeNode* root) {return height(root) >= 0;
}

分析

        根据height函数的返回值判断是否是平衡二叉树,在height函数中,我们先递归完左子树到头时返回0并将该值用leftHeight接收,然后递归当前结点的右子树如果也为空则返回0,然后判断leftHeight和rightHeight以及它俩的差值的绝对值是否大于一,一般来说该判断语句第一次结果为真都是因为差值绝对值大于一,然后才会返回-1,导致leftHeight或者rightHeight值为-1,然后-1会一直传递直到整个递归结束,它标志着该二叉树不是平衡二叉树,当该判断语句为假时就会利用fmax函数计算当前结点作为一棵树时的高度,如果该树不是平衡二叉树就会导致,该高度会一直叠加从而第一次触发fabs函数,然后就整体递归调用返回-1,该树不为平衡二叉树

时空复杂度 

时间复杂度:O(N)(n是二叉树中的节点个数,每个节点的计算高度和判断是否平衡都只需要处理一次

空间复杂度:O(N)( n是二叉树中的节点个数,空间复杂度主要取决于递归调用的层数,递归调用的层数不会超过n)

总结 

        自顶向下的看着很美,细看由于没有记录结点,存在子序列重复的情况。主函数内return封住了当前为平衡点以及左右子结点为平衡点,可是每次递归都会重复对尾部到当前的第n-1高度结点重复判断,导致了 n(1+n)/2, 效率太低。所以还得是自下向上,省去了记忆化过程,天然回溯到父节点就可以得到子节点的高度

2、翻转二叉树

226. 翻转二叉树 - 力扣(LeetCode) 

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/struct TreeNode* invertTree(struct TreeNode* root) {if (root == NULL) {return NULL;}struct TreeNode* left = invertTree(root->left);struct TreeNode* right = invertTree(root->right);root->left = right;root->right = left;return root;
}

分析

        由于二叉树是链式结构的,所以更改父亲结点的同时,该父亲结点的子孙结点都会跟着移动,所以这里我们利用递归,分别将两个要翻转的两颗子树的左右子树进行翻转,然后在递归返回地过程中将两个树地父亲结点也翻转,这样就完成了一次二叉树地翻转

时空复杂度 

时间复杂度:O(N)(n是二叉树中的节点个数,使用自底向上的递归,每个节点的计算高度和判断是否平衡都只需要处理一次,最坏情况下需要遍历二叉树中的所有节点)

空间复杂度:O(N)( n是二叉树中的节点个数,空间复杂度主要取决于递归调用的层数,递归调用的层数不会超过n)

~over~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/239599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 下更新 Host

文章目录 更新Host Linux 下更新 Host Linux下下载github代码&#xff0c;经常超时&#xff0c;有时候可通过更新host来解决。以下梳理总结几种更新 host的方法。 更新Host #方法一(openwrt&#xff0c;也利用于linux) wget -q https://gitlab.com/ineo6/hosts/-/raw/master/…

【Grafana】Grafana匿名访问以及与LDAP连接

上一篇文章利用Docker快速部署了Grafana用来展示Zabbix得监控数据&#xff0c;但还需要给用户去创建账号允许他们登录后才能看展示得数据&#xff0c;那有什么办法让非管理员更方便得去访问Grafana呢&#xff1f;下面介绍两个比较方便实现的&#xff1a; 在开始设置前&#xff…

显示器屏幕oled的性能、使用场景、维护

OLED显示器屏幕具有许多独特的性能和使用场景&#xff0c;以下是关于OLED显示器屏幕的性能、使用场景和维护的详细介绍&#xff1a; 一、性能 色彩鲜艳&#xff1a;OLED显示器屏幕能够呈现出更加鲜艳的色彩&#xff0c;色彩饱和度高&#xff0c;色彩还原性好&#xff0c;可以给…

SpringBoot+JaywayJsonPath实现Json数据的DSL(按照指定节点表达式解析json获取指定数据)

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_前后端分离项目本地运行-CSDN博客 在上面搭建SpringBoot项目的基础上&#xff0c;并且在项目中引入fastjson、hutool等所需依赖后。 Jayway JsonPat…

【【C++11特性篇】【强制/禁止 】生成默认函数的关键字default&delete(代码演示)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Linux》…

动物分类识别教程+分类释义+界面展示

1.项目简介 动物分类教程分类释义界面展示 动物分类是生物学中的一个基础知识&#xff0c;它是对动物进行分类、命名和描述的科学方法。本教程将向您介绍动物分类的基本原则和方法&#xff0c;并提供一些常见的动物分类释义。 动物分类的基本原则 动物分类根据动物的形态、…

vue3老项目如何引入vite

vue3老项目如何引入vite 安装 npm install vite vitejs/plugin-vue --save-dev Vite官方中文文档修改package.json文件 在 npm scripts 中使用 vite 执行文件 "scripts": {"serve": "vite","build": "vite build","pr…

听GPT 讲Rust源代码--src/tools(22)

File: rust/src/tools/tidy/src/lib.rs rust/src/tools/tidy/src/lib.rs是Rust编译器源代码中tidy工具的实现文件之一。tidy工具是Rust项目中的一项静态检查工具&#xff0c;用于确保代码质量和一致性。 tidy工具主要有以下几个作用&#xff1a; 格式化代码&#xff1a;tidy工具…

Rust报错:the msvc targets depend on the msvc linker but `link.exe` was not found

当我在我的 windows 电脑上安装 rust&#xff0c;然后用 cargo 新建了一个项目后&#xff0c;cargo run 会报错&#xff1a; error: linker link.exe not found| note: program not foundnote: the msvc targets depend on the msvc linker but link.exe was not foundnote: p…

css学习笔记6(盒子模型)

CSS盒子模型 五、CSS盒子模型1.CSS长度单位2.元素的显示模式3.总结各元素的显示模式4.修改元素显示模式5.盒子模型的组成6.盒子内容区&#xff08;content&#xff09;7.关于默认宽度8.盒子内边距&#xff08;padding&#xff09;9.盒子边框&#xff08;border&#xff09;10.盒…

Apache Flink 进阶教程(七):网络流控及反压剖析

目录 前言 网络流控的概念与背景 为什么需要网络流控 网络流控的实现&#xff1a;静态限速 网络流控的实现&#xff1a;动态反馈/自动反压 案例一&#xff1a;Storm 反压实现 案例二&#xff1a;Spark Streaming 反压实现 疑问&#xff1a;为什么 Flink&#xff08;bef…

4-Docker命令之docker load

1.docker load介绍 docker load命令是用来将从tar归档文件载入镜像 docker load命令相对应的命令是docker save 2.docker load用法 docker load [参数] [root@centos79 ~]# docker load --helpUsage: docker load [OPTIONS]Load an image from a tar archive or STDINAli…

基于Netty构建Websocket服务端

除了构建TCP和UDP服务器和客户端&#xff0c;Netty还可以用于构建WebSocket服务器。WebSocket是一种基于TCP协议的双向通信协议&#xff0c;可以在Web浏览器和Web服务器之间建立实时通信通道。下面是一个简单的示例&#xff0c;演示如何使用Netty构建一个WebSocket服务器。 项目…

深圳鼎信|输电线路防山火视频监控预警装置:森林火灾来袭,安全不留白!

受线路走廊制约和环保要求影响&#xff0c;输电线路大多建立在高山上&#xff0c;不仅可以减少地面障碍物和人类活动的干扰&#xff0c;还能提高线路的抗灾能力和可靠性。但同时也会面临其它的难题&#xff0c;例如森林火灾预防。今天&#xff0c;深圳鼎信智慧将从不同角度分析…

在电路实际设计中PCI 的三态和 OD、OC 信号要有上拉。

在PCI总线以及其他数字电路设计中,三态(Tri-state)、开漏(Open Drain, OD)和开集(Open Collector, OC)是常见的输出信号类型。这些信号类型通常需要外部上拉电阻来确保信号线在不被任何设备驱动时能够被拉到高电平状态。 三态(Tri-state)信号 ,三态信号具有高电平、低…

signaltap立即触发的错误解决方法

signaltap点下run analysis后没有等到触发条件满足就触发了&#xff0c;原因是触发方式设置错误&#xff0c;应修改触发方式&#xff1a; 将Trigger flow control 从State-based 改为Sequential。

trino-435版本windows下源码编译

一、源码下载地址 https://github.com/trinodb/trino/tags 二、编译环境及工具准备 1、maven &#xff08;1&#xff09;版本&#xff1a;3.6.3 &#xff08;2&#xff09;settings.xml配置 <?xml version"1.0" encoding"UTF-8"?> <settin…

Jmeter 性能测试 —— 评估一个系统TPS与并发数!

问题&#xff1a;性能压测&#xff0c;如何评估一个系统的TPS和并发数&#xff1f; 1、对于新系统 由业务部门或开发人员预估交易量和TPS指标 可以参考公式&#xff1a;并发用户 在线用户数 * 10%。 当一个系统还没有上线时&#xff0c;我们可以预判的是这个系统准备要给多…

hyperf 十八 数据库 一

教程地址&#xff1a;Hyperf 一、安装 1.1 hyperf框架 composer require hyperf/db-connection 1.2 其他框架 composer require hyperf/database 二、配置 配置项类型默认值备注driverstring无数据库引擎hoststring无数据库地址databasestring无数据库默认 DBusernamest…

【数据结构】队列的使用|模拟实现|循环队列|双端队列|面试题

一、 队列(Queue) 1.1 概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾&#xff08;Tail/Rear&#xff09; 出队列…