【Leetcode】平衡二叉树

平衡二叉树

题目

在这里插入图片描述

在这里插入图片描述

思路与代码实现

常规解法:

 int max(int a,int b){return a>b?a:b;}int maxDepth(struct TreeNode* root) 
{if(root==NULL)return 0;return 1+max(maxDepth(root->left),maxDepth(root->right));
}bool isBalanced(struct TreeNode* root) 
{if(root==NULL)return true;if(abs(maxDepth(root->left)-maxDepth(root->right))>=2)return false;return isBalanced(root->left)&&isBalanced(root->right);
}

常规解法虽然能解决问题,但是仔细地看,该算法时间复杂度达到了O(N*N)。

主要原因是重复步骤太多,可以看出该遍历方式是前序遍历,我们每次比较当前高度差是否符合“平衡”时,都需要层层计算其子树高度,这样当我们再次来算他子树高度时,有些步骤显得冗余。

举个例子:求A的高度就需要求B的高度,求B的高度就需要求C的高度…然后在求B的高度时又需要求C的高度…这样就做了许多重复工作

所以这个时候我们可以就行后序遍历,即层递归到求叶子结点高度,然后在求完下层高度后在求上层高度,再求上层高度时将下层的高度返回到上层,这样上层就无需在做一些求下层高度的冗余操作。

具体优化代码:

int max(int a,int b){return a>b?a:b;}int maxDepth(struct TreeNode* root) 
{if(root==NULL)return 0;return 1+max(maxDepth(root->left),maxDepth(root->right));
}bool _isBalanced(struct TreeNode* root,int* pDepth)
{if(root==NULL){*pDepth=0;return true;}int leftDepth=0;if(_isBalanced(root->left,&leftDepth)==false)return false;int rightDepth=0;if(_isBalanced(root->right,&rightDepth)==false)return false;if(abs(leftDepth-rightDepth)>1)return false;*pDepth=1+max(leftDepth,rightDepth);return true;
}bool isBalanced(struct TreeNode* root) 
{int depth=0;return _isBalanced(root,&depth);
}

此时时间复杂度就达到了O(N)

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

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

相关文章

【AI实践】阿里百炼文本对话Agent安卓版搭建

环境:安卓手机运行环境;WinsurfAI编程工具;阿里百炼提前创建Agent应用; 耗时:2小时; 1,新建安卓项目 完成文本输入,并将输入的文字显示出来。 2,安装SDK 参考文档 安…

一文读懂Docker之Docker Compose

目录 一、Docker Compose简介 二、Docker Compose的安装和基本使用 1、Docker Compose的安装 步骤一、下载docker-compose 步骤二、新增可执行权限 步骤三、查看是否安装成功 2、Docker Compose的基本使用 (1)、docker-compose up (2)、docker-compose ps (3)、docke…

WordPress“更新失败,响应不是有效的JSON响应”问题的修复

在使用WordPress搭建网站时,许多人在编辑或更新文章时,可能会遇到一个提示框,显示“更新失败,响应不是有效的JSON响应”。这个提示信息对于不了解技术细节的用户来说,太难懂。其实,这个问题并不复杂&#x…

信息学奥赛一本通 1973 【16NOIP普及组】买铅笔 | 洛谷 P1909 [NOIP 2016 普及组] 买铅笔

【题目链接】 ybt 1973 【16NOIP普及组】买铅笔 洛谷 P1909 [NOIP 2016 普及组] 买铅笔 【题目考点】 1. 简单数学 2. 数组 3. 向上取整 <cmath>中有函数double ceil(double x)&#xff0c;求x向上取整的值。 如果求正整数 ⌈ a b ⌉ \lceil \frac{a}{b} \rceil ⌈…

C++中的.*运算符

看运算符重载的时候&#xff0c;看到这一句 .* :: sizeof ?: . 注意以上5个运算符不能重载。 :: sizeof ?: . 这四个好理解&#xff0c;毕竟都学过&#xff0c;但.*是什么&#xff1f; 于是自己整理了一下 .* 是一种 C 中的运算符&#xff0c;称为指针到成…

【JavaEE进阶】MyBatis通过注解实现增删改查

目录 &#x1f343;前言 &#x1f340;打印日志 &#x1f334;传递参数 &#x1f38b;增(Insert) &#x1f6a9;返回主键 &#x1f384;删(Delete) &#x1f332;改(Update) &#x1f333;查(Select) &#x1f6a9;起别名 &#x1f6a9;结果映射 &#x1f6a9;开启驼…

【分布式理论14】分布式数据库存储:分表分库、主从复制与数据扩容策略

文章目录 一、分表分库1. 数据分表的必要性与方式2. 数据分库原则与优势 二、主从复制1. 读写分离架构设计2. 数据复制方式3. MySQL实现主从复制4. MySQL主从复制实践与高可用方案 三、数据扩容 随着业务的不断发展和数据量的增长&#xff0c;传统的单机关系型数据库已经逐渐不…

vxe-grid 通过配置式给单元格字段格式化树结构数据,转换树结构节点

vxe-grid 通过配置式给单元格字段格式化树结构数据&#xff0c;转换树结构节点 比如用户自定义配置好的数据源&#xff0c;通过在列中配置好数据&#xff0c;全 json 方式直接返回给前端渲染&#xff0c;不需要写任何格式化方法。 官网&#xff1a;https://vxetable.cn npm i…

延迟任务的11种实现方式(下)!!

接上文&#xff1a; Redisson的RDelayedQueue Redisson他是Redis的儿子&#xff08;Redis son&#xff09;&#xff0c;基于Redis实现了非常多的功能&#xff0c;其中最常使用的就是Redis分布式锁的实现&#xff0c;但是除了实现Redis分布式锁之外&#xff0c;它还实现了延迟…

BS5852英国家具防火安全条款主要包括哪几个方面呢?

什么是BS5852检测&#xff1f; BS5852是英国针对家用家具的强制性安全要求&#xff0c;主要测试家具在受到燃烧香烟和火柴等火源时的可燃性。这个标准通常分为四个部分进行测试&#xff0c;但实际应用中主要测试第一部分和第二部分&#xff0c;包括烟头测试和利用乙炔火焰模拟…

如何使用Spark SQL进行复杂的数据查询和分析

使用Spark SQL进行复杂的数据查询和分析是一个涉及多个步骤和技术的过程。以下是如何使用Spark SQL进行复杂数据查询和分析的详细指南&#xff1a; 一、准备阶段 环境搭建&#xff1a; 确保已经安装并配置好了Apache Spark环境。准备好数据源&#xff0c;可以是CSV文件、JSON…

iOS事件传递和响应

背景 对于身处中小公司且业务不怎么复杂的程序员来说&#xff0c;很多技术不常用&#xff0c;你可能看过很多遍也都大致了解&#xff0c;但是实际让你讲&#xff0c;不一定讲的清楚。你可能说&#xff0c;我以独当一面&#xff0c;应对自如了&#xff0c;但是技术的知识甚多&a…

FFmpeg 源码编译安装

参考&#xff1a; https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu Linux (Ubuntu) 下载 FFmpeg 源码&#xff0c;并将其解压&#xff0c;这里我将它放在 ~/ffmpeg_source 目录下&#xff1b; cd ~/ffmpeg_sources wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org…

【pytest】编写自动化测试用例命名规范README

API_autoTest 项目介绍 1. pytest命名规范 测试文件&#xff1a; 文件名需要以 test_ 开头或者以 _test.py 结尾。例如&#xff0c;test_login.py、user_management_test.py 这样的命名方式&#xff0c;pytest 能够自动识别并将其作为测试文件来执行其中的测试用例。 测试类…

Windows桌面系统管理5:Windows 10操作系统注册表

Windows桌面系统管理0&#xff1a;总目录-CSDN博客 Windows桌面系统管理1&#xff1a;计算机硬件组成及组装-CSDN博客 Windows桌面系统管理2&#xff1a;VMware Workstation使用和管理-CSDN博客 Windows桌面系统管理3&#xff1a;Windows 10操作系统部署与使用-CSDN博客 Wi…

llama.cpp将sensor格式的大模型转化为gguf格式

前言 ollama本地只能导入gguf格式的大模型文件&#xff0c;将safetensors 文件转化为gguf格式。需要使用 llama.cpp 这个开源工具。以下是使用 llama.cpp 转换 .safetensors 格式模型到 .gguf 格式的详细步骤: 1. 首先克隆并编译 llama.cpp: 克隆项目 git clone https://gi…

【运维】源码编译安装cmake

背景&#xff1a; 已经在本地源码编译安装gcc/g&#xff0c;现在源码安装cmake 下载源码 下载地址&#xff1a;CMake - Upgrade Your Software Build System 安装步骤&#xff1a; ./bootstrap --prefix/usr/local/cmake make make install 错误处理 1、提示找不到libmpc.…

如何通过AI优化敏捷开发中的任务管理与分配?

用ChatGPT做软件测试 在现代软件开发中&#xff0c;敏捷开发&#xff08;Agile&#xff09;已成为一种广泛采用的开发方法论&#xff0c;其核心思想是强调快速响应变化、与客户的持续沟通以及团队协作的高效性。然而&#xff0c;随着项目规模的不断扩大&#xff0c;敏捷开发面临…

petalinux高版本设置自动登录和开机自启动配置

petalinux-config -c rootfs 依次选择 Image Features -> serial-autologin-root 这是配置 进来就是root权限 创建并安装名为 myapp-init 的新建应用程序 petalinux-create -t apps --template install -n myapp-init --enable 编辑 project-spec/meta-user/recipes-…

STM32 USB 设备的描述信息作用

在使用 STM32 USB 功能时 usbd_desc.c 文件中定义了一段宏&#xff0c;以下解每段宏的用途。 #define USBD_VID 1155 #define USBD_LANGID_STRING 1033 #define USBD_MANUFACTURER_STRING "STMicroelectronics" #define US…