判断平衡二叉树

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

(不是我们平时意义上的必须为搜索树)

判断一棵树是否为平衡二叉树:

 

可以暴力判断:每一颗树是否为平衡二叉树。

 

分析:

如果左右子树都已知是平衡二叉树,而左子树和右子树高度差绝对值不超过1,本树就是平衡的。

 

为此我们需要的信息:左右子树是否为平衡二叉树。左右子树的高度。

 

我们需要给父返回的信息就是:本棵树是否是平衡的、本棵树的高度。

 

定义结点和返回值:

	public static class Node {public int value;public Node left;public Node right;public Node(int data) {this.value = data;}}
	public static class ReturnType {public int level;   //深度public boolean isB;//本树是否平衡public ReturnType(int l, boolean is) {level = l;isB = is;}}

我们把代码写出来:

	// process(head, 1)public static ReturnType process(Node head, int level) {if (head == null) {return new ReturnType(level, true);}//取信息ReturnType leftSubTreeInfo = process(head.left, level + 1);if(!leftSubTreeInfo.isB) {return new ReturnType(level, false);     //左子树不是->返回}ReturnType rightSubTreeInfo = process(head.right, level + 1);if(!rightSubTreeInfo.isB) {return new ReturnType(level, false);     //右子树不是->返回}if (Math.abs(rightSubTreeInfo.level - leftSubTreeInfo.level) > 1) {return new ReturnType(level, false);     //左右高度差大于1->返回}return new ReturnType(Math.max(leftSubTreeInfo.level, rightSubTreeInfo.level), true);//返回高度和true(当前树是平衡的)}

我们不需要每次都返回高度,用一个全局变量记录即可。

对于其它二叉树问题,可能不止一个变量信息,所以,全局记录最好都养成定义数组的习惯。

下面贴出完整代码:

import java.util.LinkedList;
import java.util.Queue;public class Demo {public static class Node {public int value;public Node left;public Node right;public Node(int data) {this.value = data;}}public static boolean isBalance(Node head) {boolean[] res = new boolean[1];res[0] = true;getHeight(head, 1, res);return res[0];}public static class ReturnType {public int level;   //深度public boolean isB;//本树是否平衡public ReturnType(int l, boolean is) {level = l;isB = is;}}// process(head, 1)public static ReturnType process(Node head, int level) {if (head == null) {return new ReturnType(level, true);}//取信息ReturnType leftSubTreeInfo = process(head.left, level + 1);if(!leftSubTreeInfo.isB) {return new ReturnType(level, false);     //左子树不是->返回}ReturnType rightSubTreeInfo = process(head.right, level + 1);if(!rightSubTreeInfo.isB) {return new ReturnType(level, false);     //右子树不是->返回}if (Math.abs(rightSubTreeInfo.level - leftSubTreeInfo.level) > 1) {return new ReturnType(level, false);     //左右高度差大于1->返回}return new ReturnType(Math.max(leftSubTreeInfo.level, rightSubTreeInfo.level), true);//返回高度和true(当前树是平衡的}public static int getHeight(Node head, int level, boolean[] res) {if (head == null) {return level;//返回高度}//取信息//相同逻辑int lH = getHeight(head.left, level + 1, res);if (!res[0]) {return level;}int rH = getHeight(head.right, level + 1, res);if (!res[0]) {return level;}if (Math.abs(lH - rH) > 1) {res[0] = false;}return Math.max(lH, rH);//返回高度}public static void main(String[] args) {Node head = new Node(1);head.left = new Node(2);head.right = new Node(3);head.left.left = new Node(4);head.left.right = new Node(5);head.right.left = new Node(6);head.right.right = new Node(7);System.out.println(isBalance(head));}}

 

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

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

相关文章

剑指offer_02

文章目录第二章 面试需要的基础知识1.1 面试官谈基础知识1.2 编程语言1.3 数据结构1.4 算法和数据操作第二章 面试需要的基础知识 1.1 面试官谈基础知识 数据结构和算法,编程能力,部分数学能力,问题分析和推理能力编程基础,计算…

求完全二叉树的结点个数

第一次见这个题,看时间小于O(N)。。。。。 只能是二分啊。 但是怎么二分,条件是什么,真的想不到。 后来知道了,我们要找最深一层最右边那个结点。借此确定结点个数。 我们知道,满二叉树的结点个数和深度是有公式的&a…

剑指offer_03

文章目录第三章 高质量代码1.1 面试官谈高质量代码1.2 代码的规范性1.3 代码的完整性1.4 代码的鲁棒性第三章 高质量代码 1.1 面试官谈高质量代码 代码应该考虑异常状况和垃圾回收问题,不能忽视边界情况变量,函数命名应该要统一,备注要恰到…

剑指offer_04

文章目录第四章 解决面试题的思路1.1 面试官谈面试思路1.2 画图让问题抽象化1.3 举例让抽象问题具体化1.4 分解让复杂问题具体化第四章 解决面试题的思路 1.1 面试官谈面试思路 编程前讲自己的思路是一项考核指标,不能一开始就变成,面试的时候应该和面…

先序中序后序两两结合重建二叉树

遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结…

剑指offer_05

文章目录第五章 优化时间和空间效率1.1 面试官谈效率1.2 时间效率1.3 时间效率和空间效率的平衡第五章 优化时间和空间效率 1.1 面试官谈效率 1.时间和空间复杂度是写程序的时候,我们需要分析的,最好每次写完代码后自己都可以将程序的时间和空间复杂度…

先序中序数组推后序数组

二叉树遍历 所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。 从二叉树的递归定义可知,一…

剑指offer_06

文章目录第六章 面试中的各项能力1.1 面试官谈能力1.2 沟通能力和学习能力1.3 知识迁移能力1.4 抽象建模能力1.5 发散思维能力第六章 面试中的各项能力 1.1 面试官谈能力 1.礼貌平和,不卑不亢的和面试官沟通;逻辑清楚,详略得到的介绍项目经…

数据结构课上笔记11

满二叉树 (Full binary tree) 除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树。 国内教程定义:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树…

数据结构和算法(01)--- 算法复杂度

文章目录算法时间复杂度算法时间复杂度 要判断算法的好坏,可以从时间方面进行分析。算法运行的越快,所用的时间越短则算法越好。但是同一个算法在不同的平台上的运行时间不同。那么又该如何进行评判呢?我们采用时间复杂度进行衡量。 1.算法时…

数据结构课上笔记12

二叉树的存储结构 顺序存储结构 完全二叉树:用一组地址连续的 存储单元依次自上而下、自左至右存 储结点元素,即将编号为 i 的结点元 素存储在一维数组中下标为 i –1 的分量中。 一般二叉树:将其每个结点与完 全二叉树上的结点相对照&…

kaggle(01)-泰坦尼克号问题

经典又兼具备趣味性的Kaggle案例泰坦尼克号问题 大家都熟悉的『Jack and Rose』的故事,豪华游艇倒了,大家都惊恐逃生,可是救生艇的数量有限,无法人人都有,副船长发话了『lady and kid first!』&#xff0c…

数据结构课上笔记13

树存储结构 父节点表示法 数据域:存放结点本身信息。 双亲域:指示本结点的双亲结点在数组中的位置。 对应的树: /* 树节点的定义 */ #define MAX_TREE_SIZE 100typedef struct{TElemType data;int parent; /* 父节点位置域 */ } PTNode;type…

数据结构课上笔记14

图是一种: 数据元素间存在多对多关系的数据结构 加上一组基本操作构成的抽象数据类型。 图 (Graph) 是一种复杂的非线性数据结构,由顶点集合及顶点间的关系(也称弧或边)集合组成。可以表示为: G=(V, V…

kaggle(03)-自行车租赁预测问题(基础版)

文章目录问题描述:问题解决分析问题:解决问题第一步:读取原始数据第二步:观察原始数据第三步:原始数据的可视化第四步:数据的预处理时间属性的分解第五步:数据的特征提取特征生成特征选择第六步…

二叉树序列化/反序列化

二叉树被记录成文件的过程,为二叉树的序列化 通过文件重新建立原来的二叉树的过程,为二叉树的反序列化 设计方案并实现。 (已知结点类型为32位整型) 思路:先序遍历实现。 因为要写入文件,我们要把二叉树…

机器学习总结(17)-XGBoost

文章目录lecture17:XGBoost(eXtreme Gradient Boosting)目录1. XGBoost的基本信息2. XGBoost与GBDT的异同点3. XGBoost的原理3.1定义树的复杂度3.2 分裂节点3.3 自定义损失函数4. XGBoost的使用lecture17:XGBoost(eXtreme Gradient Boosting) 目录 1. …

C++基础学习(01)--(介绍,环境配置,基本语法,注释)

文章目录目录一. c介绍二. c开发环境到的配置三. c基本语法四. c注释目录 一. c介绍 C 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。 C 被认为是一种中级语言,它综合了高级语言和低…

《Head First设计模式》读书笔记_第一章

策略模式 例:设计一个模拟鸭子游戏,游戏中有各种鸭子,一边戏水一边嘎嘎叫。 所以学习设计模式前,我们最先想到的就是设置一个超类,并让其他子类去继承这个类,UML图如下: * * 但是&#xff0…

根据数组建立平衡二叉搜索树

它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉(搜索)树。 二分:用有序数组中中间的数生成搜索二叉树的头节点,然后对数组的左右部分分别生成左右子树即可(重复…