Tree_Graph 判断是否平衡二叉树 @CareerCup

判断二叉平衡树的三种方法 题目 实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下,任意一个节点,其两颗子树的高度差不超过1。 分析 判断平衡二叉树是一个常见题目,一般来说,我们都是求出左右子树的高度,根据定义判断其差。下面给出三种实现方法,大家可以对比其优劣。 代码 /* 题目描述 实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点, 其两颗子树的高度差不超过1。 给定指向 阅读详情

Implement a function to check if a binary tree is balanced. For the purposes of this question, a balanced tree is defined to be a tree such that the heights of the two subtrees of any node never differ by more than one.


平衡二叉树的定义为:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1, 并且左右两个子树都是一棵平衡二叉树。


思路:

1)先写一个递归的树的高度函数,然后检查子树的高度差是否大于1

2)优化:把检查子树高度差是否大于1的逻辑放在求树的高度的递归函数中,并且遇到非平衡就及时返回。


注:

这道题不同于问一棵树是否平衡(这棵树任意两个叶子结点到根结点的距离之差不大于1):

  


如上图,为平衡二叉树,但不平衡。

判断一棵树是否平衡可以求树的最大高度和最小高度之差是否大于1。

求树的最小高度可参考:http://blog.youkuaiyun.com/fightforyourdream/article/details/12851231


另一种解法是可以用中序遍历求得树里的每一个叶子的高度,然后可得。

参考:http://hawstein.com/posts/4.1.html


下面是判断是否平衡二叉树的代码:

package Tree_Graph;

import CtCILibrary.AssortedMethods;
import CtCILibrary.TreeNode;

public class S4_1 {

	// 递归判断树是否平衡二叉树
	// Time: O(N^2)
	public static boolean isBalanced(TreeNode root) {
		if (root == null) {
			return true;
		}
		int heightDiff = getHeight(root.left) - getHeight(root.right);
		if(Math.abs(heightDiff) > 1) {		// 非平衡
			return false;
		} else {
			return isBalanced(root.left) && isBalanced(root.right);
		}
	}
	
	// 递归获得树的高度
	public static int getHeight(TreeNode root) {
		if (root == null) {
			return 0;
		}
		return Math.max(getHeight(root.left), getHeight(root.right)) + 1;
	}
	
	
	// ========================== Improved version 优化版
	// 把判断是否平衡的逻辑放在checkHeight函数里,边计算高度,
	// 边判断是否平衡,如果不平衡,直接返回-1
	// Time: O(N), Space: O(H), H: height of tree
	
	public static boolean isBalanced2 (TreeNode root) {
		if (checkHeight(root) == -1) {
			return false;
		} else{
			return true;
		}
	}
	
	// 边计算高度边判断是否平衡
	public static int checkHeight (TreeNode root) {
		if (root == null) {
			return 0;
		}
		
		int leftHeight = checkHeight(root.left);
		if (leftHeight == -1) {
			return -1;
		}
		
		int rightHeight = checkHeight(root.right);
		if (rightHeight == -1) {
			return -1;
		}
		
		int heightDiff = leftHeight - rightHeight;
		if (Math.abs(heightDiff) > 1) {
			return -1;
		}
		
		return Math.max(leftHeight, rightHeight) + 1;
	}
	
	public static void main(String[] args) {
		// Create balanced tree
		int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
		TreeNode root = TreeNode.createMinimalBST(array);
		System.out.println("Root? " + root.data);
		System.out.println("Is balanced? " + isBalanced(root));

		// Could be balanced, actually, but it's very unlikely...
		TreeNode unbalanced = new TreeNode(10);
		for (int i = 0; i < 10; i++) {
			unbalanced.insertInOrder(AssortedMethods.randomIntInRange(0, 100));
		}
		System.out.println("Root? " + unbalanced.data);
		System.out.println("Is balanced? " + isBalanced(unbalanced));
	}
	
}




Halcon一维测量实战:从measure_pos与measure_pairs的底层原理到精准应用 本文深入解析Halcon中measure_pos与measure_pairs算子的底层原理与精准应用,涵盖参数调优、测量矩形方向设置及典型工业场景实战。通过对比分析,揭示两者在一维测量中的核心差异与适用场景,提供从基础到高级的完整解决方案,助力工业视觉检测精度提升。 阅读详情

相关推荐

从零开始:Doherty功率放大器的ADS仿真实践指南

本文详细介绍了Doherty功率放大器在ADS中的仿真设计流程,从基础原理到实际工程应用。通过负载调制技术,Doherty结构显著提高了功率放大器的效率,特别适合处理高峰均比信号。文章包含ADS环境搭建、对称与非对称设计、常见问题调试等实用内容,为射频工程师提供全面的实践指南。

weixin_29313547的博客 689

110. Balanced Binary Tree && 面试题 04.04. Check Balance LCCI && 面试题55 - II. 平衡二叉树

Problem Implement a function to check if a binary tree is balanced. For the purposes of this question, a balanced tree is defined to be a tree such that the heights of the two subtrees of any node nev...

Bryan要加油 462

Ubuntu离线情况下安装gcc编译器

Ubuntu离线情况下安装gcc编译器1.系统版本2.安装说明3.异常处理 1.系统版本 (1)Ubuntu系统版本:20.04.1LTS; (2)gcc编译器版本:gcc-9.3.0(下载链接为https://download.youkuaiyun.com/download/qq_18350351/13762214); 当前可找到的gcc最新版本为gcc-10,但是笔者在安装gcc-10版本时发现一些依赖项无法安装,因此选取了gcc-9版本。如果是在联网情况下安装,直接使用apt相关的安装指令即可。 2.安装说明 安

GreenHand的博客 3932

[CareerCup] 4.1 Balanced Binary Tree 平衡二叉树

4.1 Implement a function to check if a binary tree is balanced. For the purposes of this question, a balanced tree is defined to be a tree such that the heights of the two subtre...

weixin_34081595的博客 124

数字锁相环的原理与FPGA实现

数字锁相环是锁相环电路的全数字实现。锁相环电路能够实现对输入信号的相位进行跟踪,进而在噪声中提取纯净的有用信号。以上就是今天要讲的内容,本文简单地介绍了锁相环的原理,然后,在Vivado仿真平台上,通过verilog做仿真验证。最终仿真结果能够实现锁定,但锁定时间较长,表明参数仍可做调整。

weixin_45857378的博客 8510

信号完整性基础04:串扰(1)

我们理解了“单个”传输线(传输线是信号路径+回流路径,切记~),但大多数情况下单独“传输线”的情况并不多见(理想情况下的同轴线缆可以算一个),大多数我们PCB板上有成百上千条走线,它们组成了一个“大社会”,就如当年的TVB神剧《创世纪》一样,到处充满着恩怨情仇;稍处理不慎,单板这个“社会”就会崩溃。那么我们要从哪里入手去理解它呢?最基本的就是从两条PCB走线(传输线)之间的串扰开始。好,年前倒数第二章:《为什么会有串扰》。 ps:我们了解了x射线是啥,那么今天开始讲“放射线”,这两种东西是否就是同一种呢~

WKEZHENG的博客 6032

Q4.1 Implement a function to check if a tree is balanced

Q: Implement a function to check if a tree is balanced. For the purposes of this question, a balanced tree is defined to be a tree such that no two leaf nodes differ in distance from the root by mor

xinxinxv的专栏 454

Python实战:超分辨率图像质量评估全攻略——PSNR、SSIM、LPIPS与NIQE的代码实现与优化

本文详细介绍了在Python中实现超分辨率图像质量评估的完整方案,涵盖PSNR、SSIM、LPIPS和NIQE四大核心指标。通过模块化代码设计、多进程并行处理和GPU加速优化,帮助开发者构建高效、可扩展的评估系统,并提供了实战避坑指南与结果解读方法。

weixin_29053073的博客 474

判断平衡二叉树

判断平衡二叉树题目详情示例题解方法一:先序遍历(自顶向下) 题目详情        输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。 示例 给定二叉树 [3,9,20,null,null,15,7]    3   /  \  9  20    &

qq_44705203的博客 2367

激光雷达点云配准:ICP与NDT算法详解

激光雷达点云配准:ICP与NDT算法详解​ ,人工智能,计算机视觉,大模型,AI,本文深入解析激光雷达点云配准的ICP与NDT算法。阐述了点云配准基础概念与评价指标,详解ICP算法原理、流程、最优变换矩阵计算、优缺点及改进版,给出Python代码示例;同样解析NDT算法的原理、流程、模型构建、优缺点、参数选择与代码示例。还对比两者在精度、效率、鲁棒性和适用场景的差异,提供算法选择建议,介绍实际应用案例、常见问题及解决方法,探讨算法发展趋势。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 15万+

DaVinci Developer和DaVinci Configurator:AutoSAR开发与配置工具

a. 组件创建:DaVinci Developer允许开发人员创建不同类型的AutoSAR软件组件,如应用软件组件(Application Software Component,SWC)、基础软件组件(Basic Software Component,BSWC)等。除了以上功能,DaVinci Developer和DaVinci Configurator还提供了丰富的文档和代码生成功能,以支持开发人员和配置人员进行文档编写、代码生成和文档浏览等任务。用户可以根据具体需求对软件组件进行灵活的配置。

HmoaAmp的博客 2262

判断是否为平衡二叉树

判断是否为平衡二叉树

weixin_50601177的博客 3642

【ODX介绍】-4.2-UDS诊断$27服务在ODX-D诊断描述文件中如何描述

共25页精讲:附ODX-D XML:UDS $27 Security服务0x61和0x62 Sub-Function,其它Sub-Function可参照其格式。 目录 1 ODX-D描述一个UDS $27 Security服务Sub-Function的结构 2 标签DIAG-SERVICE描述的内容 2.1 举例:DIAG-SERVICE的XML描述 3 标签REQUEST描述的内容 3.1 举例:REQUEST的XML描述 4 标签POS-RESPONSE描述的内容 4.1 举例:PO..

「汽车电子助手」的博客 1121

每日一题之二叉树

描述 输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。 在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树 平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 样例解释: 样例二叉树如图,为一颗平衡二叉树 注:我们约定空树是平衡二叉树。 数据范围:n \le 100n≤100,树上节点的val值满足0 \le n \le 10000≤n≤1000 要.

m0_50290125的博客 1580

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

数据结构之判断平衡二叉树详解与示例(C,C++)

AVL树是一种自平衡的二叉搜索树,其中任何节点的两个子树的高度最大差别为1。这种平衡保证了树的高度大约是log(n),其中n是树中节点的数量。这使得AVL树在最坏情况下的查找、插入和删除操作的时间复杂度都是O(log n)。首先,我们需要定义树的节点结构。键值(Key)左子树指针(Left)右子树指针(Right)节点高度(Height)C语言示例int key;int height;C++语言示例int key;int height;

qq_35320456的博客 1723

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

数据结构之——平衡二叉树(内容详解)

一、基本概念 平衡二叉树也叫AVL树,它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和左子树的高度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。 二、结构 如基本概念所树,它具有一个左子树和一个左子树,且对于任意一个子树而言,左子树和右子树高度只差不超过1. 2.1 平衡二叉树判别 如下有3棵树,分别判断下哪个是平衡二叉树? 图1: 图2:...

m0_37914588的博客 11万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

判断是否是平衡二叉树

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回 true 。 示例 2: 给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3 3 / \ 4 4...

a1085653724的博客 3442

判断一颗二叉树是否为平衡二叉树

一.判断一颗二叉树是否为平衡二叉树 题目:输入一颗二叉树的根节点,判断该二叉树是否为平衡二叉树。所谓的平衡二叉树是指以当前结点为根结点的树,左右子树的深度不得超过1。 例如: 解决思路一:按照前序遍历的路线判断。 1.判断以根结点的树是否为二叉平衡树。求出左右子树的高度,判断它们的高度差是否超过了1。 2.递归判断根的左子树是否为平衡二叉树 3.递归判断根的右子树是否...

HanSion.Z 3万+

判断二叉树是否为平衡二叉树

平衡二叉树的递归定义: (1)空树。 (2)他的左子树和右子树都是平衡二叉树,并且左子树和右子树的高度差的绝对值不会超过1(<=1)。 根据平衡二叉树的定义,可以很容易的判断一棵二叉树是否为平衡二叉树,首先是空树,满足条件。如果不是空树,需要检验它的两棵子树高度差的绝对值,这里需要一个辅助程序,求解一棵二叉树的高度。如果不满足条件(2)即不是平衡二叉树,如果满足,递归的判断其左右子树是否同时...

乐行僧的博客 1633

平衡二叉树详解 通俗易懂

平衡二叉树(AVL) 阅读之前请先了解 二叉搜索树 平衡二叉树定义:任意节点的子树的高度差都小于等于 1 1. 为什么使用「平衡二叉树」 二叉树能提高查询的效率 O(logn),但是当你插入 {1,2,3,4,5,6} 这种数据的时候,你的二叉树就像一个「链表」一样,搜索效率变为 O(n) 于是在 1962 年,一个姓 AV 的大佬(G. M. Adelson-Velsky) 和一个姓 L 的大佬( Evgenii Landis)提出「平衡二叉树」(AVL) 。 于是插入 {1,2,3,4,5,6}

半亩方糖 14万+

判断二叉树是不是平衡二叉树、完全二叉树、满二叉树||C++实现

本文介绍了判断一颗二叉树是不是平衡、完全、满二叉树,并给出C++代码。

李志杰的博客 1182

110. 平衡二叉树-E

110. 平衡二叉树-E 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回 true 。 示例 2: 给定二叉树 [1,2,2,3,3,null...

longtails的博客 414

平衡二叉树(C语言)

这个方法容易想到,但是时间复杂度太高,为O(N*N),出现了重复计算,因此我们可以选择优化这个代码,将时间复杂度变为O(N)。平衡二叉树是指左右子树高度相差小于等于1的二叉树。

2401_83440536的博客 491

110. 平衡二叉树(迭代法)

给定一个二叉树,判断它是否是。

mrjieke6的博客 515
上一篇: Stack_Queue 猫狗队列问题 Cat dog queue @CareerCup
下一篇: Tree_Graph 有向图是否存在路径 @CareerCup
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值