C++ 判断是不是平衡二叉树

news/2024/11/8 12:29:46 标签: c++, 数据结构, 算法

一:题目

      输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树

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

       样例解释:

二:实现: 

     解题思路:

  1. 使用递归来遍历每个节点,计算左右子树的高度。
  2. 如果左右子树的高度差超过 1,直接返回 false。
  3. 如果某一子树不是平衡的,直接返回 false。
  4. 同时递归地返回当前子树的高度。
#include <iostream>
#include <algorithm>
#include <functional>

struct TreeNode
{
	int val;
	TreeNode* left; 
	TreeNode* right;

	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

bool isBalanced(TreeNode* root)
{
	std::function<int(TreeNode*)> height = [&](TreeNode* node) -> int {
		if (node == nullptr)
		{
			return 0;
		}

		int leftHeight = height(node->left);
		if (leftHeight == -1) return -1;
		int rightHeight = height(node->right);
		if (rightHeight == -1) return -1;

		if (std::abs(leftHeight - rightHeight) > 1)
		{
			return -1;
		}

		return std::max(leftHeight, rightHeight) + 1;
	};

	return height(root) != -1; 
}

int main()
{
	TreeNode* root = new TreeNode(1);
	root->left = new TreeNode(2);
	root->right = new TreeNode(3);
	root->left->left = new TreeNode(4);
	root->left->right = new TreeNode(5);
	//root->left->left->left = new TreeNode(6);


	// 判断树是否平衡
	if (isBalanced(root)) {
		std::cout << "The tree is balanced." << std::endl;
	}
	else {
		std::cout << "The tree is not balanced." << std::endl;
	}
}


http://www.niftyadmin.cn/n/5743900.html

相关文章

以RK3568为例,ARM核心板如何实现NTP精准时间同步?

背景 网络时间协议NTP&#xff08;Network TimeProtocol&#xff09;是用于互联网中时间同步的标准互联网协议&#xff0c;可以把计算机的时间同步到某些时间标准。NTP对于我们产品来说有什么用呢&#xff0c;简单的讲&#xff0c;当你的设备时间不准确了&#xff0c;你可以接…

【Linux】进程控制——创建,终止,等待回收

目录 进程创建fork再介绍写时拷贝 进程终止退出码退出方式 进程等待获取子进程statuswaitwaitpid 在前两篇进程概念中&#xff0c;对进程进行了介绍&#xff0c;进行了初步认识&#xff0c;也认识到了与之相关联的进程地址空间&#xff1b;本文则对进程的生命周期——创建&…

【论文复现】自动化细胞核分割与特征分析

本文所涉及所有资源均在这里可获取。 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 论文复现 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 自动化细胞核分割与特征分析 引言效果展示HoverNet概述HoverNet原理分析整…

Uniapp去除顶部导航栏-小程序、H5、APP适用

在 UniApp 中&#xff0c;"globalStyle" 配置项用于设置全局样式&#xff0c;特别是用于小程序、App 和 H5 页面上的导航栏样式。 1. 修改 pages.json 配置&#xff08;局部配置&#xff09; 如果你希望特定页面去除顶部导航栏&#xff0c;可以在pages配置"na…

Python中文本类型和列表类型的相互转换

目录 1. 将str转换为list2. 应用场景2.1 API数据接收2.2 WEB开发 3. 将数据转换为str3.1 str函数3.2 json.dumps函数3.3 对比 4. 应用场景 1. 将str转换为list 在Python中&#xff0c;可以通过ast.literal_eval函数来实现&#xff0c;它能够安全地评估一个字符串&#xff0c;并…

Redis - 数据库管理

Redis 提供了⼏个⾯向Redis数据库的操作&#xff0c;分别是dbsize、select、flushdb、flushall命令&#xff0c; 本机将通过具体的使⽤常⻅介绍这些命令。 一、切换数据库 select dbIndex 许多关系型数据库&#xff0c;例如MySQL⽀持在⼀个实例下有多个数据库存在的&#…

C语言复习第7章 自定义类型(结构体+位段+枚举+联合体)

目录 一、结构体1.1 内置类型和自定义类型1.2 结构体的概念1.3 结构体基本的声明1.4 区分两种创建结构体变量的方式1.5 结构体变量的定义和初始化1.6 区分一下typdef和变量列表1.7 匿名结构体类型1.8 访问结构体成员1.9 修改字符数组成员变量的时候 要用strcpy1.10 结构体的传参…

一七五、HTML 不同类型的事件及其说明和示例

HTML 事件处理程序是通过 JavaScript 来捕获和响应不同的用户操作、系统事件或浏览器事件。下面是不同类型的事件及其说明和示例。 Window 事件 1. onresize 当浏览器窗口的大小发生变化时触发。 <!DOCTYPE html> <html lang"en"> <head><m…