【程序员面试金典】实现一个函数,检查二叉树是否平衡,

2023-11-14

题目描述

实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1。

给定指向树根结点的指针TreeNode* root,请返回一个bool,代表这棵树是否平衡。


题目分析:

<方法1>:

      平衡二叉树是通过左右子树的高度来判断是否为平衡二叉树的,所以我们首先想到的是如何求一个树的高度,求一个树的高度很简单,递归求解,每次求出左右子树的最大高度再加1便是父节点的高度,这样递归下去,便可以求出任何一颗树的高度。

       既然可以求出任何一个节点的高度,那么通过再次遍历二叉树,判断任何一个节点的左右子树高度相差是否满足平衡二叉树便可实现平衡二叉树的判断。

       求一颗平衡树高度的时间复杂度为O(logN),那么在第二次遍历的时候需要求每个节点的高度时间复杂度为O(NlogN)。其实这个过程大部分都是重复判断的,下面的方法是该方法的浓缩。

<方法2>:

      在一次遍历的过程中,既求一个节点的高度,同时该节点是否满足平衡条件,递归函数中一个引用参数返回子节点的高度,然后父节点的高度便可以通过两个子节点的高度求出来,首先判断两个子节点的高度是否满足平衡二叉树,不满足直接返回,满足的情况下,求出当前节点的高度,继续向上递归。

      该方法的时间复杂度只有O(logN)


/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/

class Balance {
public:
    bool isBalance(TreeNode* root) 
    {
        // write code here
        int high=0;
        return isBalance1(root,high);
    }
    
    bool isBalance1(TreeNode* root,int &high)
    {
        if(root==NULL)
        {
            high=0;
            return true;
        }
        int lhigh,rhigh;
        if(!isBalance1(root->left,lhigh)||!isBalance1(root->right,rhigh))
            return false;
        if(lhigh-rhigh>1||lhigh-rhigh<-1)
            return false;
        high=(lhigh>=rhigh?lhigh:rhigh)+1;
        return true;
    }
};

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【程序员面试金典】实现一个函数,检查二叉树是否平衡, 的相关文章

  • 《大话vxworks》

    目录 序言 第一章 VxWorks简介 1 1 VxWorks的起源 1 2 发展历程 1 3 应用场景 第二章 VxWorks架构
  • 拦截器源码分析

    Slf4j Controller public class BlueController ResponseBody GetMapping bb public String bb HttpSession session return sess
  • 升序定时器的时间链表的完全实现

    李邦柱 helpylee 126 com 1 定时器简介 定时器通常包含至少两个成员 一个超时时间 通常采用相对时间或者超时时间 和一个超时时间到达后的一个回调函数 有时候还可能包含回调函数被执行时需要传入的参数 以及是否重新启动定时器 更
  • Parasoft VS Borland SilkTest,谁的功能测试更全面?

    你知道测试金字塔吗 为了用开发实践来扩大测试规模 如何以正确的数量设计合适类型的自动化测试 测试金字塔是一个很好的指南 测试金字塔是一个很好的视觉隐喻 它描述了不同的测试层 以及每一层要做多少测试 Parasoft测试金字塔 虽然测试自动化
  • 网络安全-信息收集简介

    本文为作者学习文章 按作者习惯写成 如有错误或需要追加内容请留言 不喜勿喷 本文为追加文章 后期慢慢追加 什么是信息收集 信息收集是指通过各种方式获取所需要的信息 以便我们在后续的渗透过程更好的进行 比如目标站点IP 中间件 脚本语言 端口

随机推荐

  • 将pandas.core.frame.DataFrame转换为列表

    将pandas core frame DataFrame转换为列表 上代码 import pandas as pd df pd DataFrame Header A foo a bar a baz a Header B foo b bar
  • 基于unity的AR开发中使用shader遮盖原图像的解决办法

    解决问题 当识别图像并显示虚拟物体成功后 将原图片中存在的物体图像遮盖 使用的识别图形 图中含有瓶子 将该瓶子模型添加为为ImageTarget的子物体 将这个模型位置移动到与图片中瓶子位置一致 create plane 作为ImageTa
  • 为什么软件开发很难外包

    很多公司和团队选择把整个软件项目或项目中某些模块或过程 比如测试 整体外包给另一家公司或团队 本文将和你一起来探讨为什么公司或团队有外包的冲动 为什么项目外包问题多和我对外包的建议 01 为什么有外包的冲动 公司或团队选择把项目外包 无非就
  • 计算机网络知识汇总(超详细)

    目录 第一章 概念 组成 功能 和 分类 计算机网络概念 计算机网络功能 计算机网络的组成 计算机网络的分类 总结 标准化工作及相关组织 标准化工作 标准化工作相关组织 总结 计算机网路的速率 带宽 吞吐量 1 速率 2 带宽 3 吞吐量
  • IT项目管理-个人作业6

    1 教材练习题6 答 a 如下图所示 b 所有路径如下 路径1 A B E H K 10天 路径2 A B E I J K 14天 路径3 A C F H K 12天 路径4 A C F I J K 16天 路径5 A D G J K 15
  • 网络分析工具——WireShark的使用(超详细)

    网络分析工具 WireShark的使用 简介 WireShark软件安装 Wireshark 开始抓包示例 WireShark抓包界面 WireShark 主要分为这几个界面 TCP包的具体内容 Wireshark过滤器设置 wiresha
  • 素数环问题(回溯法)

    素数环是一个计算机程序问题 指的是将从1到n这n个整数围成一个圆环 若其中任意2个相邻的数字相加 结果均为素数 那么这个环就成为素数环 现在要求输入一个n 求n个数围成一圈有多少种素数环 规定第一个数字是1 include
  • Python实现常用的假设检验

    开门见山 这篇文章 教大家用Python实现常用的假设检验 服从什么分布 就用什么区间估计方式 也就就用什么检验 比如 两个样本方差比服从F分布 区间估计就采用F分布计算临界值 从而得出置信区间 最终采用F检验 建设检验的基本步骤 前言 假
  • Angular ng-model

    验证是否是邮箱
  • 【电源】开关电源工作原理

    1 开关电源的定义 输入交流电压 AC 经由整流滤波以后可获得一高压的直流电压 DC 1 4AC 此电压接入交换元件当做开关使用在20KHZ 100KHZ的高频状态 这时直流高压会被切割成高频的方波信号 这个方波信号经由功率隔离变压器 在二
  • Java类的声明及文件命名规范】- 在Java中定义公共类的正确姿势

    Java类的声明及文件命名规范 在Java中定义公共类的正确姿势 引言 在Java编程中 类的声明和文件的命名是非常重要的 这决定了代码的结构性和可维护性 本文将详细介绍如何在Java中声明公共类 并遵循正确的文件命名规范 以确保代码的可读
  • MSP430项目设计:2020年TI杯大学生电子设计竞赛 坡道行驶电动小车(C题)循迹小车(分享项目展示视频与源码)

    文章目录 题目要求 一 硬件设计 二 理论分析与计算 三 电路与程序设计 四 测试方案与测试结果 五 项目展示 2021年10月27 2022年1月1日 可承接毕业设计 课程设计 价格实惠 有意可添加Q2809786963 哔哩哔哩项目展示
  • 在eclipse下单步调试python

    在eclipse下可以单步调试python的方法 1 右键单击标尺栏添加断点 2 将鼠标移至需要添加断点的代码行 使用快捷键 Ctrl F10 在弹出的菜单栏中选择 Add Breakpoint 添加断点 添加好断点后 选择 Debug A
  • 软件工程实践作业----软件评测

    这个作业属于哪个课程 lt 软件工程23年春季 gt 这个作业要求在哪里 lt 软件工程实践作业 软件评测 gt 这个作业的目标 对产品调研评测 思考分析 建议和规划 其他参考文献 构建之法 目录 Bug严重性量化标准 一 第一部分 调研评
  • iphonex屏幕出现一条绿线_如何解决iPhone屏幕断触、触控不灵敏问题?

    虽然从显示技术和触控体验方面来说 iPhone 都能超过绝大多数智能手机 但是在日常使用过程中偶尔会存在一些问题 例如断触 触摸不灵敏 有些问题来自于系统本身 有些则可能是硬件原因 针对使用过程中遇到的屏幕问题 可以从以下 4 个方面解决
  • Unity 初识:坐标系与向量

    世界坐标系 场景中的绝对坐标系 场景上所有物体都是以该坐标系的原点来确定各自位置的 世界坐标即物体在世界坐标系中的位置 局部坐标系 以物体的世界坐标为原点 角度为朝向 大小为单位 所产生一个新的坐标系 该坐标系中 物体的位置 旋转 大小都会
  • 免费国外视频素材网站

    这里自己收藏几个可以免费下载国外视频的网站 希望大家喜欢 可以的话给个关注哟 Pexels Videos https videos pexels com Pexels 是一个著名的免费图片平台 每天都会有大量的设计师和博客写手来这里为他们的
  • 前端接入萤石云

    萤石云有两个方法使用 npm引入 非npm引入 两个方法中的js内容不同 所以容器初始化方法也不同 详情可到github查看 https github com Hikvision Ezviz npm引入 步骤一 首先通过npn下载 npm
  • 对字符串按照一定的长度来分行或者添加其他数据

    核心代码 对字符串按照一定的长度来分行或者添加其他数据 param str 原始字符串 param int length 插入的间隔长度 param string append 需要插入的字符串 return string 返回字符串 fu
  • 【程序员面试金典】实现一个函数,检查二叉树是否平衡,

    题目描述 实现一个函数 检查二叉树是否平衡 平衡的定义如下 对于树中的任意一个结点 其两颗子树的高度差不超过1 给定指向树根结点的指针TreeNode root 请返回一个bool 代表这棵树是否平衡 题目分析 lt 方法1 gt 平衡二叉