数据结构:二叉树一文详解
数据结构:二叉树一文详解
- 前言
- 一、二叉树的基本概念与结构特性
- 1.1 二叉树的定义
- 1.2 二叉树的特殊类型
- 1.3 二叉树的性质
- 二、二叉树的遍历方式
- 2.1 前序遍历(Pre-order Traversal)
- 2.2 中序遍历(In-order Traversal)
- 2.3 后序遍历(Post-order Traversal)
- 2.4 层次遍历(Level-order Traversal)
- 三、二叉树的经典算法问题
- 3.1 二叉树的深度
- 3.2 二叉树的镜像
- 3.3 二叉搜索树(BST)的插入与删除
- 四、二叉树的应用场景
- 4.1 搜索与排序
- 4.2 表达式解析
- 4.3 数据压缩
- 总结
前言
二叉树是一种基础且重要的数据结构,以其独特的树形层次结构和高效的数据处理能力,广泛应用于搜索算法、编译器设计、数据压缩等众多场景。无论是初学者入门数据结构,还是资深开发者解决复杂问题,二叉树都是必须掌握的核心内容。本文我将从二叉树的基本概念、结构特性出发,深入讲解其遍历方式、经典算法以及实际应用场景,并结合代码示例,帮助读者全面掌握二叉树相关知识。
一、二叉树的基本概念与结构特性
1.1 二叉树的定义
二叉树是一种每个节点最多有两个子树的树结构,这两个子树分别称为左子树和右子树 。二叉树的节点包含三个部分:数据元素、指向左子树的指针、指向右子树的指针。特殊情况下,二叉树可以为空树,即不包含任何节点;也可以只有一个根节点,而没有子树。
1.2 二叉树的特殊类型
-
满二叉树:除最后一层无任何子节点外,每一层上的所有节点都有两个子节点的二叉树。满二叉树的每一层节点数都达到最大值,若其深度为
h
,则节点总数为 2 h − 1 2^h - 1 2h−1。 -
完全二叉树:对于深度为
k
的二叉树,除第k
层外,其余各层(1 -k - 1
层)的节点数都达到最大个数,且第k
层的节点都集中在该层最左边的若干位置。完全二叉树可以用数组高效存储,从根节点开始,按从上到下、从左到右的顺序依次将节点存入数组。 -
平衡二叉树:左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树。常见的平衡二叉树有 AVL 树、红黑树等,它们在保证树结构平衡的同时,能有效提高搜索、插入和删除操作的效率。
1.3 二叉树的性质
-
在二叉树的第
i
层上,最多有 2 i − 1 2^{i - 1} 2i−1个节点( i ≥ 1 i \geq 1 i≥1)。 -
深度为
h
的二叉树,最多有 2 h − 1 2^h - 1 2h−1个节点。 -
对于任意一棵二叉树,如果其叶子节点数为 n 0 n_0 n0,度为 2 的节点数为 n 2 n_2 n2,则 n 0 = n 2 + 1 n_0 = n_2 + 1 n0=n2+1。
二、二叉树的遍历方式
二叉树的遍历是指按照某种顺序访问二叉树中的所有节点,且每个节点仅被访问一次。常见的遍历方式有三种:前序遍历、中序遍历和后序遍历,此外还有层次遍历。
2.1 前序遍历(Pre-order Traversal)
前序遍历的顺序是:先访问根节点,然后递归地前序遍历左子树,最后递归地前序遍历右子树。C++ 实现如下:
#include <iostream>
using namespace std;// 定义二叉树节点结构
struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};// 前序遍历
void preorderTraversal(TreeNode* root) {if (root == NULL) return;cout << root->val << " ";preorderTraversal(root->left);preorderTraversal(root->right);
}
2.2 中序遍历(In-order Traversal)
中序遍历的顺序是:先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。在二叉搜索树(BST)中,中序遍历的结果是有序序列。
// 中序遍历
void inorderTraversal(TreeNode* root) {if (root == NULL) return;inorderTraversal(root->left);cout << root->val << " ";inorderTraversal(root->right);
}
2.3 后序遍历(Post-order Traversal)
后序遍历的顺序是:先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。后序遍历常用于释放二叉树的内存等场景。
// 后序遍历
void postorderTraversal(TreeNode* root) {if (root == NULL) return;postorderTraversal(root->left);postorderTraversal(root->right);cout << root->val << " ";
}
2.4 层次遍历(Level-order Traversal)
层次遍历是按照二叉树的层次,从根节点开始,一层一层地访问节点,同一层节点按照从左到右的顺序访问。通常使用队列来实现层次遍历。
#include <queue>
// 层次遍历
void levelorderTraversal(TreeNode* root) {if (root == NULL) return;queue<TreeNode*> q;q.push(root);while (!q.empty()) {TreeNode* node = q.front();q.pop();cout << node->val << " ";if (node->left != NULL) {q.push(node->left);}if (node->right != NULL) {q.push(node->right);}}
}
三、二叉树的经典算法问题
3.1 二叉树的深度
计算二叉树的深度可以通过递归的方式,二叉树的深度等于其左子树深度和右子树深度的最大值加 1。
// 计算二叉树的深度
int maxDepth(TreeNode* root) {if (root == NULL) return 0;int leftDepth = maxDepth(root->left);int rightDepth = maxDepth(root->right);return max(leftDepth, rightDepth) + 1;
}
3.2 二叉树的镜像
将二叉树进行镜像操作,即交换每个节点的左子树和右子树,可以通过递归实现。
// 二叉树镜像
TreeNode* mirrorTree(TreeNode* root) {if (root == NULL) return NULL;TreeNode* temp = root->left;root->left = mirrorTree(root->right);root->right = mirrorTree(temp);return root;
}
3.3 二叉搜索树(BST)的插入与删除
二叉搜索树的特点是左子树所有节点的值均小于根节点的值,右子树所有节点的值均大于根节点的值。插入和删除操作需要保持这一特性。
// 二叉搜索树插入节点
TreeNode* insertIntoBST(TreeNode* root, int val) {if (root == NULL) {return new TreeNode(val);}if (val < root->val) {root->left = insertIntoBST(root->left, val);} else {root->right = insertIntoBST(root->right, val);}return root;
}// 二叉搜索树删除节点(较为复杂,此处为简化版本)
TreeNode* deleteNode(TreeNode* root, int val) {if (root == NULL) return root;if (val < root->val) {root->left = deleteNode(root->left, val);} else if (val > root->val) {root->right = deleteNode(root->right, val);} else {if (root->left == NULL) {TreeNode* temp = root->right;delete root;return temp;} else if (root->right == NULL) {TreeNode* temp = root->left;delete root;return temp;}TreeNode* temp = root->right;while (temp->left != NULL) {temp = temp->left;}root->val = temp->val;root->right = deleteNode(root->right, temp->val);}return root;
}
四、二叉树的应用场景
4.1 搜索与排序
二叉搜索树(BST)常用于实现搜索和排序功能。通过中序遍历 BST 可以得到有序序列,插入和删除操作的平均时间复杂度为 O ( log n ) O(\log n) O(logn),相比于普通数组的排序和搜索操作效率更高。平衡二叉树(如 AVL 树、红黑树)在保持树结构平衡的同时,进一步优化了搜索、插入和删除的性能,广泛应用于数据库索引、编程语言的符号表等场景。
4.2 表达式解析
在编译器和计算器中,二叉树可以用来表示表达式。表达式中的操作数作为叶子节点,操作符作为非叶子节点,通过遍历二叉树可以实现表达式的求值、化简等操作 。例如,表达式(3 + 4) * 2
可以表示为一棵二叉树,根节点为乘号,左子树表示3 + 4
,右子树表示2
。
4.3 数据压缩
哈夫曼树是一种特殊的二叉树,常用于数据压缩算法(如哈夫曼编码)。通过构建哈夫曼树,为出现频率高的字符分配较短的编码,为出现频率低的字符分配较长的编码,从而实现数据的压缩存储和传输。
总结
二叉树作为一种基础且重要的数据结构,从基本的遍历方式到复杂的算法问题,从理论知识到实际应用场景,深入理解和掌握二叉树相关内容对于提升编程能力和解决实际问题至关重要。随着学习深入,我们还将进一步探索二叉树与其他数据结构、算法的结合应用,如二叉堆、线段树等,不断拓展知识的边界。
That’s all, thanks for reading!
创作不易,点赞鼓励;
知识无价,收藏备用;
持续精彩,关注不错过!
相关文章:
数据结构:二叉树一文详解
数据结构:二叉树一文详解 前言一、二叉树的基本概念与结构特性1.1 二叉树的定义1.2 二叉树的特殊类型1.3 二叉树的性质 二、二叉树的遍历方式2.1 前序遍历(Pre-order Traversal)2.2 中序遍历(In-order Traversal)2.3 后序遍历&…...
2025年- H28-Lc136- 24.两两交换链表中的节点(链表)---java版
1.题目描述 2.思路 cur指针要先放在虚拟头节点,才能去操作第一个数和第二个数 先判断偶数个节点,再判断奇数个节点,否则会犯空指针异常。 (1)如果节点是偶数个节点,只要满足curr.nextnull,就说…...
ubuntu18.04通过cuda_11.3_xxx.run安装失败,电脑黑屏解决办法
项目场景: ubuntu18.04跑DG-SLAM相关代码,安装lietorch包报错,需要用到GPU。 问题描述 跑代码需要cuda11.3,系统里面有另外一个版本,运行cuda_11.3_xxx.run,同时也选择了driver,安装成功后&am…...
Linux之基础IO
目录 一、理解 "文件" 1.1、狭义理解 1.2、广义理解 1.3、文件操作的归类认知 1.4、系统角度 二、回顾C语言接口 2.1、打开文件 2.2、写文件 2.3、读文件 2.4、stdin & stdout & stderr 2.6、打开文件的方式 三、系统文件I/O 3.1、一种传递标志…...
上位机知识篇---涂鸦智能云平台
文章目录 前言 前言 本文简单介绍了涂鸦智能云平台。...
InfluxDB 3 Core + Java 11 + Spring Boot:打造高效物联网数据平台
一、 引言:为什么选择InfluxDB 3? 项目背景: 在我们的隧道风机监控系统中,实时数据的采集、存储和高效查询是至关重要的核心需求。风机运行产生的振动、倾角、电流、温度等参数是典型的时序数据,具有高并发写入、数据…...
Kubernetes控制平面组件:Kubelet详解(七):容器网络接口 CNI
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
Pandas 构建并评价聚类模型② 第六章
构建并评价聚类模型 构建并评价聚类模型一、数据读取与准备(代码6 - 6部分)结果代码解析 二、Kmeans聚类(代码6 - 6部分)结果代码解析 三、数据降维可视化(代码6 - 6部分)结果代码解析 四、FMI评价…...
【simulink】IEEE33节点系统潮流分析模型
目录 主要内容 程序内容 2.1 33节点simulink模型一览 2.2 节点模型图 下载链接 主要内容 该仿真采用simulink模型对33节点网络进行模拟仿真,在simulink模型中定义了33节点系统的电阻、电抗、节点连接关系等参数,通过控制块来实现信号连接关系&…...
彻底解决docker代理配置与无法拉取镜像问题
为什么会有这篇文章? 博主在去年为部署dify研究了docker,最后也是成功部署,但是因为众所周知的原因,卡ziji脖子 ,所以期间遇到各种网络问题的报错,好在最后解决了. 但时隔一年,博主最近因为学习原因又一次使用docker,原本解决的问题却又没来由的出现,且和之前有很多不同(有时…...
Linux 安装 Unreal Engine
需要对在unreal engine官网进行绑定github账号,然后到unreal engine github仓库中进行下载对应的版本,并进行安装unreal engine官网 github地址...
tensorflow图像分类预测
tensorflow图像分类预测 CPU版本和GPU版本二选一 CPU版本 pip -m install --upgrade pippip install matplotlib pillow scikit-learnpip install tensorflow-intel2.18.0GPU版本 工具 miniconda 升级依赖库 conda update --all创建目录 mkdir gpu-tf进入目录 cd gpu-tf创建虚…...
C++数组详解:一维和多维数组的定义、初始化、访问与遍历
1. 引言 数组是C中最基础的数据结构之一,用于存储相同类型的元素的集合。它提供了高效的内存访问方式,适用于需要快速查找和遍历数据的场景。本文将全面介绍: 一维数组的定义、初始化与遍历多维数组(如二维数组)的定…...
linux下编写shell脚本一键编译源码
0 前言 进行linux应用层编程时,经常会使用重复的命令对源码进行编译,然后把编译生成的可执行文件拷贝到工作目录,操作非常繁琐且容易出错。本文编写一个简单的shell脚本一键编译源码。 1 linux下编写shell脚本一键编译源码 shell脚本如下&…...
安卓端互动娱乐房卡系统调试实录:从UI到协议的万字深拆(第一章)
前言:调房卡,不如修空调(但更费脑) 老实说,拿到这套安卓端互动组件源码的时候,我内心是拒绝的。不是因为它不好,而是太好了,目录规整、界面精美、逻辑还算清晰,唯一的问…...
【通用大模型】Serper API 详解:搜索引擎数据获取的核心工具
Serper API 详解:搜索引擎数据获取的核心工具 一、Serper API 的定义与核心功能二、技术架构与核心优势2.1 技术实现原理2.2 对比传统方案的突破性优势 三、典型应用场景与代码示例3.1 SEO 监控系统3.2 竞品广告分析 四、使用成本与配额策略五、开发者注意事项六、替…...
宝塔面板屏蔽垃圾搜索引擎蜘蛛和扫描工具的办法
首先进入宝塔面板,文件管理进入/www/server/nginx/conf目录,新建空白文件kill_bot.conf。然后将以下代码保存到当前文件中。 #禁止垃圾搜索引擎蜘蛛抓取if ($http_user_agent ~* "CheckMarkNetwork|Synapse|Nimbostratus-Bot|Dark|scraper|LMAO|Ha…...
【低成本STM32的T-BOX开发实战:高可靠的车联网解决方案】
基于STM32的车辆远程通信终端(T-BOX)开发实战:低成本高可靠的车联网解决方案 目录 引言:为什么需要T-BOX?系统总体设计:T-BOX的架构与核心功能硬件设计:STM32主控与关键模块解析 STM32F105VCT6…...
聚类算法K-means和Dbscan的对比
K-means和DBSCAN_dbscan和kmeans的区别-CSDN博客...
mysql的高可用
1. 环境准备 2台MySQL服务器(node1: 192.168.1.101,node2: 192.168.1.102)2台HAProxy Keepalived服务器(haproxy1: 192.168.1.103,haproxy2: 192.168.1.104)虚拟IP(VIP: 192.168.1.100&#x…...
vue3 elementplus tabs切换实现
Tabs 标签页 | Element Plus <template><!-- editableTabsValue 是当前tab 的 name --><el-tabsv-model"editableTabsValue"type"border-card"editableedit"handleTabsEdit"><!-- 这个是标签面板 面板数据 遍历 editableT…...
printf在c语言中代表什么(非常详细)
在C语言中,有三个函数可以用来向控制台(可以理解为显示器或者屏幕)输出数据,它们分别是: 输出函数说明用法演示puts()只能输出字符串,并且输出结束后会自动换行puts("C language is great");put…...
Linux梦开始的地方
1.概率 经过C语言,数据结构,C的学习我们现在要开始学习Linux的学习了。我们学习Linux是从四部分来进行的: 1.Linux初识,Linux环境,Linux指令,Linux开发环境。 2.Linux系统。 3.Linux网络 4.MySQL Lin…...
关于机器学习的实际案例
以下是一些机器学习的实际案例: 营销与销售领域 - 推荐引擎:亚马逊、网飞等网站根据用户的品味、浏览历史和购物车历史进行推荐。 - 个性化营销:营销人员使用机器学习联系将产品留在购物车或退出网站的用户,根据客户兴趣定制营销…...
Kubernetes控制平面组件:Kubelet详解(五):切换docker运行时为containerd
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
<前端小白> 前端网页知识点总结
HTML 标签 1. 标题标签 h1到h6 2. 段落标签 p 3. 换行 br 水平线 hr 4. 加粗 strong 倾斜 em 下划线 ins 删除 del 5. 图像标签 img src-图像的位置 alt- 图片加载失败显示的文字 替换文本 title--- 鼠标放到图片上显示的文字 提示…...
【Linux驱动】Linux 按键驱动开发指南
Linux 按键驱动开发指南 1、按键驱动开发基础 1.1. 按键驱动类型 Linux下的按键驱动主要有两种实现方式: 输入子系统驱动:最常用,通过input子系统上报按键事件 字符设备驱动:较少用,需要自己实现文件操作接口 1.…...
AI日报 - 2025年05月19日
🌟 今日概览 (60秒速览) ▎🤖 大模型前沿 | GPT-5传闻再起,将基于全新模型构建,与GPT-4彻底分离;Claude 3.7 Sonnet系统提示泄露,揭示其主动引导对话、多语言支持及安全新特性;研究指出直接复用…...
BUUCTF——ReadlezPHP
BUUCTF——ReadlezPHP 进入靶场 看了看框架和源码信息 没有什么可以利用的地方 爆破一下目录看看 结果只出来个index.php 看了一下Findsomthing 报了个路径 /time.php?source拼接访问一下 出了个php代码 <?php #error_reporting(0); class HelloPhp {public $a;pub…...
java集合相关的api-总结
简介 集合是存储数据的容器,集合相关的API提供了不同的数据结构,来满足不同的需求。这里是对常见集合API的使用场景和相关源码的一个总结,在实际开发中,如果不知道该选择什么集合,这篇文章也许可以参考一下。 集合相…...
FloodFill算法:洪水般的图像处理艺术
简单来说就是一场洪水(雨水)会把低洼的地方淹没 也就是一道题,你要找出所有为负数的连通块,对角线不能连通,所以上述图有两个 其实也很简单,就是你扫描的过程,发现一个负数,就以这…...
【开源分享】健康饮食管理系统(双端+论文)
💻技术栈 前后端分离项目,PC双端(管理端用户端) 后端:Javaspringboot 前端:vue 数据库:mysql 💡运行效果图 1. 管理端: 2. 用户端: 📕源码获…...
【图像生成大模型】CogVideoX-5b:开启文本到视频生成的新纪元
CogVideoX-5b:开启文本到视频生成的新纪元 项目背景与目标模型架构与技术亮点项目运行方式与执行步骤环境准备模型加载与推理量化推理 执行报错与问题解决内存不足模型加载失败生成质量不佳 相关论文信息总结 在人工智能领域,文本到视频生成技术一直是研…...
C++学习:六个月从基础到就业——C++20:协程(Coroutines)
C学习:六个月从基础到就业——C20:协程(Coroutines) 本文是我C学习之旅系列的第五十篇技术文章,也是第三阶段"现代C特性"的第十二篇,继续介绍C20引入的新特性,本篇重点是协程(Coroutines)。查看完整系列目录…...
【DAY22】 复习日
内容来自浙大疏锦行python打卡训练营 浙大疏锦行 仔细回顾一下之前21天的内容 作业: 自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码 kaggle泰坦里克号人员生还预测...
tauri2项目使用sidcar嵌入可执行文件并使用命令行调用
Sidecar 是 Tauri 框架中的一个功能,允许你将现有的命令行程序(CLI)打包并分发到你的 Tauri 应用程序中。以下是它的主要作用和用法。集成命令行工具:将现有的 CLI 程序无缝集成到你的 Tauri 应用中。跨平台分发:确保你…...
选择合适的AI模型:解析Trae编辑器中的多款模型及其应用场景
在当今数字化时代,人工智能技术飞速发展,各种AI模型层出不穷,为人们的工作和生活带来了极大的便利。Trae编辑器作为一款集成了多种先进AI模型的工具,为用户提供了丰富的选择,以满足不同场景下的多样化需求。本文将深入…...
超越想象:利用MetaGPT打造高效的AI协作环境
前言 在人工智能迅速发展的今天,如何让多个大语言模型(LLM)高效协同工作成为关键挑战。MetaGPT 作为一种创新的多智能体框架,成功模拟了一个真实软件公司的运作流程,实现了从需求分析到代码实现的全流程自动化&#x…...
BOM知识点
BOM(Browser Object Model)即浏览器对象模型,是用于访问和操作浏览器窗口的编程接口。以下是一些BOM的知识点总结: 核心对象 • window:BOM的核心对象,代表浏览器窗口。它也是全局对象,所有全…...
IDE/IoT/搭建物联网(LiteOS)集成开发环境,基于 LiteOS Studio + GCC + JLink
文章目录 概述LiteOS Studio不推荐?安装和使用手册呢?HCIP实验的源码呢? 软件和依赖安装软件下载软件安装插件安装依赖工具-方案2依赖工具-方案1 工程配置打开或新建工程板卡配置组件配置编译器配置-gcc工具链编译器配置-Makefile脚本其他配置编译完成 …...
常见的 HTTP 接口(请求方法)
一:GET 作用:从服务器获取资源(查询数据)。特点: 请求参数通过 URL 传递(如https://api.example.com/users?id123),参数会显示在地址栏中。不修改服务器数据,属于幂等操…...
墨水屏显示模拟器程序解读
程序如下:出处https://github.com/tsl0922/EPD-nRF5?tabreadme-ov-file // GUI emulator for Windows // This code is a simple Windows GUI application that emulates the display of an e-paper device. #include <windows.h> #include <stdint.h>…...
【图像生成大模型】Step-Video-T2V:下一代文本到视频生成技术
Step-Video-T2V:下一代文本到视频生成技术 引言Step-Video-T2V 项目概述核心技术1. 视频变分自编码器(Video-VAE)2. 3D 全注意力扩散 Transformer(DiT w/ 3D Full Attention)3. 视频直接偏好优化(Video-DPO…...
【Java学习笔记】【第一阶段项目实践】房屋出租系统(面向对象版本)
房屋出租系统(面向对象版本) 整体思想:采用数组存储房屋信息,深刻体会面向对象的好处和过程 一、实现需求 (1)用户层 系统菜单显示 提示用户输入对应的数字选择功能 各个功能界面操作提示(底…...
18. 结合Selenium和YAML对页面继承对象PO的改造
18. 结合Selenium和YAML对页面继承对象PO的改造 一、架构改造核心思路 1.1 改造前后对比 #mermaid-svg-ziagMhNLS5fIFWrx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ziagMhNLS5fIFWrx .error-icon{fill:#5522…...
Vue-监听属性
监听属性 简单监听 点击切换名字,来回变更Tom/Jerry,输出 你好,Tom/Jerry 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>监听属性</title><!-- …...
AI写PPT可以用吗?我测试了3款AI写PPT工具,分享感受
上周五临下班,领导突然让我周末赶出一份季度营销报告 PPT,还要求周一晨会展示。看着空荡荡的 PPT 页面,我满心都是绝望 —— 周末不仅泡汤,搞不好还得熬夜到凌晨。好在同部门的前辈给我推荐了几款 AI 写 PPT 工具,没想…...
FreeSWITCH 简单图形化界面43 - 使用百度的unimrcp搞个智能话务台,用的在线的ASR和TTS
FreeSWITCH 简单图形化界面43 - 使用百度的unimrcp搞个智能话务台 0、一个fs的web配置界面预览1、安装unimrcp模块2、安装完成后,配置FreeSWITCH。2.1 有界面的配置2.1.1 mod_unimrcp模块配置2.1.2 mod_unimrcp客户端配置 2.2 无界面的配置 3、呼叫规则4、编写流程4…...
C 语言学习笔记(函数)
内容提要 函数 函数的概述函数的分类函数的定义形参和实参函数的返回值 函数 函数的概述 **函数:**实现一定功能的,独立的代码模块,对于函数的使用,一定是先定义,后使用。 使用函数的优势: ①我们可以…...
数据结构 -- 树形查找(二)平衡二叉树
平衡二叉树 定义 平衡二叉树(AVL树) – 树上的任意一点的左子树和右子树的高度之差不超过1 节点的平衡因子 左子树高-右子树高 平衡二叉树的结点的平衡因子的值只可能是-1、0、1 //平衡二叉树结点 typedef struct AVLNode{int key; //数据域int bal…...