【剑指offer-C++】JZ79:判断是不是平衡二叉树

news2024/11/29 5:26:49

【剑指offer-C++】JZ79:判断是不是平衡二叉树

    • 题目描述
    • 解题思路

题目描述

描述:输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。

在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树。

平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

样例解释:

在这里插入图片描述

样例二叉树如图,为一颗平衡二叉树。

注:我们约定空树是平衡二叉树。

数据范围:n≤100, 树上节点的val值满足 0≤n≤1000。

要求:空间复杂度O(1),时间复杂度 O(n)。

输入描述:输入一棵二叉树的根节点。

返回值描述:输出一个布尔类型的值。

输入:{1,2,3,4,5,6,7}
返回值:true
输入:{}
返回值:true

解题思路

判断是不是平衡二叉树:最直观的想法是,首先使用umap存储二叉树结点以及其对应的高度,然后编写一个函数dfs来后序遍历并记忆化搜索存储二叉树各个节点的高度。如果使用递归的思路来考虑该题,则直接考虑平衡二叉树的条件即为左右子树高度差的绝对值不超过1且左右子树均平衡。注意,将判断平衡的部分单独抽离出来并封装成一个函数,否则其会多次调用主函数中的dfs()部分。

抽离前:

    // umap统计 节点 节点高度
    unordered_map<TreeNode *,int> umap;
    // 求高度 后序遍历
    int dfs(TreeNode* cur)
    {
        // 空节点高度为0
        if(!cur)
            return 0;
        // 记忆化搜索
        if(umap.find(cur)!=umap.end())
            return umap[cur];
        // 左
        int left = dfs(cur->left);
        int right = dfs(cur->right);
        // 根节点高度等于左右子树最大高度加一
        return umap[cur]=max(left,right)+1;
    }
    bool IsBalanced_Solution(TreeNode* pRoot) {
        // 默认空树平衡
        if(!pRoot)
            return true;
        dfs(pRoot);
        // 平衡二叉树的要求是左子树平衡且右子树平衡且左右子树高度差小于等于1
        return abs(umap[pRoot->left]-umap[pRoot->right])<=1 && IsBalanced_Solution(pRoot->left) && IsBalanced_Solution(pRoot->right);
    }

抽离后:

    // umap统计 节点 节点高度
    map<TreeNode *,int> umap;
    // 求高度 后序遍历
    int dfs(TreeNode* cur)
    {
        // 空节点高度为0
        if(!cur)
            return 0;
        // 记忆化搜索
        if(umap.find(cur)!=umap.end())
            return umap[cur];
        // 左
        int l = dfs(cur->left);
        int r = dfs(cur->right);
        // 根节点高度等于左右子树最大高度加一
        return umap[cur]=max(l,r)+1;
    }
    bool isBalance(TreeNode* root)
    {
        if(!root)
            return true;
         // 平衡二叉树的要求是左子树平衡且右子树平衡且左右子树高度差小于等于1
        return abs(umap[root->left]-umap[root->right])<=1 && isBalance(root->left) && isBalance(root->right);
    }
    bool IsBalanced_Solution(TreeNode* pRoot) {
        // 默认空树平衡
        if(!pRoot)
            return true;
        dfs(pRoot);
        return isBalance(pRoot);
    }

优化:上述方法我们是先求出高度再判断是否平衡,其实我们可以边求高度边判断平衡。后序遍历求高度,先求左子树高度,再求右子树高度,接着求左右子树高度差绝对值,如果其大于1则表明不平衡则返回-1,反之返回该节点的高度值,同时在左右子树高度返回时也要判断是否为-1,并及时返回-1。

// 求高度 后序遍历
int dfs(TreeNode* cur)
{
   // 空节点高度为0
   if(!cur)
     return 0;
   // 左子树高度
   int left = dfs(cur->left);
   // 左子树平衡则返回高度 反之返回不平衡
   if(left==-1)
      return -1;
   // 右子树高度
   int right = dfs(cur->right);
   // 右子树平衡则返回高度 反之返回不平衡
   if(right==-1)
     return -1;
   // 左右子树高度差
   int diff = abs(left-right);
   // 高度差大于1不平衡
   if(diff>1)
      return -1;
   // 树的高度
   return max(left,right)+1;
}
bool IsBalanced_Solution(TreeNode* pRoot) 
{
    // 默认空树平衡
    if(!pRoot)
        return true;
    return dfs(pRoot)==-1?false:true;
}

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

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

相关文章

Nginx实现负载均衡的多种方法演示

文章目录前言一、配置讲解1.1 轮询算法&#xff08;默认&#xff09;1.2 IP_HASH算法1.3 Weighted算法1.4 URL_HASH算法总结前言 Nginx是一款高性能的Web服务器和反向代理服务器,它具有占用内存小、并发处理能力强、稳定性高等优点&#xff0c;适用于高并发、高负载的Web应用场…

pandas之DataFrame基础

pandas之DataFrame基础1. DataFrame定义2. DataFrame的创建形式3. DataFrame的属性4. DataFrame的运算5. pandas访问相关操作5.1 使用 loc[]显示访问5.2 iloc[] 隐式访问5.3 总结6. 单层索引和多层级索引6.1 索引种类与使用6.2 索引相关设置6.3 索引构造6.4 索引访问6.5 索引变…

BGP选路实验(重点是各种策略)

实验拓扑 基础配置(完成IGP的配置) 首先完成各 个接口IP地址,环回接口地址等一些基本配置&#xff0c;实现直连之间的互相通信 在R4&#xff0c;R5上的配置类似 [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 192.168.1.1 24 [Huawei-GigabitEthernet0/0/0]int g0/0…

低代码是什么意思

此前&#xff0c;阿里云智能总裁张建锋曾在钉钉发布会上表示&#xff1a;“未来的软件开发一定是碎片化的&#xff0c;低代码开发将成为未来几年的行业关键词。”这句话表明了低代码在过去两年的火爆程度&#xff0c;预示着低代码有望成为软件领域的新风口。 那低代码是什么意…

chatgpt智能提效职场办公-excel表格6-6-6格式怎么设置(数字按照三个数字一组进行分隔)

chatgpt智能提效职场办公-excel表格6-6-6格式怎么设置&#xff08;数字按照三个数字一组进行分隔&#xff09; 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 在Excel表格中设置6-6-…

移除元素(数组篇)

27. 移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中…

004:Mapbox GL设定不同的style,更换底图形态

第004个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中设定不同的style,更换底图形态 。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共70行)相关API参考:专栏目标示例效果

「业务架构」需求工程—需求规范(第3部分)

将用户和系统需求记录到文档中。需求规范它是将用户和系统需求写入文档的过程。需求应该是清晰的、容易理解的、完整的和一致的。在实践中&#xff0c;这是很难实现的&#xff0c;因为涉众以不同的方式解释需求&#xff0c;并且在需求中经常存在固有的冲突和不一致。正如我们之…

GraphInsight 拓扑图体验

蚂蚁数据可视化 | G6&#x1f4da;前言&#x1f4da;使用说明&#x1f4d5;数据规则节点的属性&#x1f4da;前言 蚂蚁数据可视化 G6 图可视化引擎是一个简单、易用、完备的图可视化引擎&#xff0c;它在高定制能力的基础上&#xff0c;提供了一系列设计优雅、便于使用的图可视…

1~3年的测试工程师薪资陷入了瓶颈期,如何突破自己实现涨薪?

对于技术人员而言&#xff0c;职业规划一般分为两个方向&#xff1a;做技术、做管理。进入软件测试行业的新人都会从最基础的执行开始&#xff0c;然后是基本的功能测试。 随后大家会根据个人职业发展来进一步细化&#xff0c;有的走管理路线&#xff0c;成为主管、经理、项目…

《操作系统》by李治军 | 实验3 - 系统调用

目录 一、实验内容 二、实验准备 1、系统调用的具体流程 &#xff08;一&#xff09;调用接口函数 API &#xff08;二&#xff09;触发 0x80 号中断 &#xff08;三&#xff09;跳转到 system_call 函数 &#xff08;四&#xff09;执行系统调用函数 sys_xxx 2、总结概…

19从零开始学Java之局部变量和成员变量是怎么回事?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在前两篇文章中&#xff0c;壹哥给大家讲解了Java里的条件分支&#xff0c;包括if和switch两种情况。…

23.Spring练习(spring、springMVC)

目录 一、Spring练习环境搭建。 &#xff08;1&#xff09;设置服务器启动的展示页面。 &#xff08;2&#xff09;创建工程步骤。 &#xff08;3&#xff09;applicationContext.xml配置文件。 &#xff08;4&#xff09;spring-mvc.xml配置文件。 &#xff08;5&#x…

Java集合——Set接口学习总结

一、HashSet实现类 1.常用方法 增加&#xff1a;add(E e)删除&#xff1a;remove(Object o)、clear()修改&#xff1a;查看&#xff1a;iterator()判断&#xff1a;contains(Object o)、isEmpty()常用遍历方式&#xff1a;Set<String> set new HashSet<String>()…

redis中布隆过滤器使用详解

文章目录一、布隆过滤器介绍1、什么是布隆过滤器2、布隆过滤器实现原理3、误判率4、布隆过滤器使用场景5、哈希表与布隆过滤器比较二、redis中布隆过滤器实战1.引入redisson依赖2.创建订单表3.配置redis4.配置BloomFilter5.创建订单6.单元测试总结一、布隆过滤器介绍 1、什么是…

什么是汽车以太网?

总目录链接>> AutoSAR入门和实战系列总目录 总目录链接>> AutoSAR BSW高阶配置系列总目录 文章目录什么是汽车以太网&#xff1f;汽车以太网市场中使用的标准和剖析汽车以太网类型什么是汽车以太网&#xff1f; 本页介绍了汽车以太网的基本特性并提到了汽车以…

【数据库】关系数据库

1.选择关系&#xff08;对行操作&#xff09; 2.投影&#xff08;对列操作&#xff09; &#xff08;行记录重复的不再显示&#xff09; 3.连接&#xff08;从两个关系的笛卡尔积中选出属性间满足一定条件的元组&#xff09; a.等值连接 b.自然连接&#xff08;等值连接的特殊…

【云原生Docker】08-Docker存储

【云原生|Docker】08-Docker存储 文章目录【云原生|Docker】08-Docker存储简介Docker存储挂载方式挂载方式介绍挂载主机目录数据卷容器特性Docker存储示例挂载主机目录Type: bindType: volume总结数据卷容器利用数据卷容器迁移数据备份数据&#xff1a;恢复数据&#xff1a;Doc…

【小程序】小程序组件-1

一. form组件的使用 这个点自己写的时候卡了好久&#xff0c;比较有感悟。 首先明确一点&#xff0c;为什么需要form。 form可以封装一个模块&#xff0c;这个模块里可以有多个input操作&#xff0c;多个输出接口&#xff0c;多个按键&#xff0c;但是至多有两个关键按键&am…

“QT快速上手指南”之计算器(一)Qt Creator,窗口组件

文章目录前言一、什么是QT&#xff1f;二、准备工作&#xff1a;1. 安装Qt Creator&#xff1a;2. 安装Qt SDK&#xff1a;3. 下载安装器&#xff1a;三、窗口组件&#xff1a;四、QT 基本组件的简单介绍&#xff1a;1. QWidget2. QPushButton3. QLabel4. QLineEdit5. QSpinBox…