C++C语言之——二叉树

二叉树 是每个节点最多只有两个子节点的树形结构,这两个子节点分别称为左孩子 和右孩子,且左右顺序固定不可颠倒。

一、二叉树的简介

基本特征

  • 每个节点度数 ≤ 2(子节点数不超过2)。

  • 子树有左右之分,即使只有一个子节点也必须区分是左还是右。

  • 递归定义:二叉树要么为空,要么由一个根节点和两棵互不相交的二叉树(左子树和右子树)组成。

存储方式

  • 链式存储:每个节点包含数据域、左指针、右指针。

  • 顺序存储(数组):按层序排列,根节点下标1,节点i的左孩子为2i,右孩子为2i+1(适用于完全二叉树)。

遍历方式

  • 前序:根→左→右

  • 中序:左→根→右

  • 后序:左→右→根

  • 层序:从上到下,从左到右

二叉树广泛应用于表达式解析、哈夫曼编码、堆、搜索算法、数据库索引等场景。

二、二叉树的分类

常见分类

类型 说明
满二叉树​ 每层节点数都达到最大值,所有叶子节点在同一层
完全二叉树​ 除最后一层外全满,最后一层节点从左到右连续排列
平衡二叉树​ 任意节点左右子树高度差不超过1
二叉搜索树​ 左子树所有节点值 < 根节点值 < 右子树所有节点值

1、满二叉树

**满二叉树(Full Binary Tree / Perfect Binary Tree)**​ 是指所有非叶子节点都有两个子节点,且所有叶子节点都在同一层的二叉树。

定义要点

  1. 每个内部节点(非叶子节点)恰好有两个子节点(左孩子和右孩子)。

  2. 所有叶子节点位于同一层(深度相同)。

  3. 不存在度为 1 的节点。

数学性质

  • 若树的高度为 h(根节点高度为 1),则节点总数为 2h−1。

  • 第 k层(1≤k≤h)的节点数为 2k−1。

  • 叶子节点数为 2h−1。

示例

高度为 3 的满二叉树:

1

/ \

2 3

/ \ / \

4 5 6 7

所有非叶子节点(1、2、3)都有两个子节点,叶子节点(4、5、6、7)都在同一层。

与完全二叉树的区别

满二叉树 完全二叉树
所有层都必须填满 允许最后一层不满,但节点必须靠左连续
节点数固定为 2h−1 节点数范围 2h−1,2h−1
一定是完全二叉树 不一定是满二叉树
叶子节点全部在同一层 叶子节点可能分布在最后两层

2、完全二叉树

**完全二叉树(Complete Binary Tree)**​ 是指除了最后一层外,其余各层的节点数都达到最大值,并且最后一层的节点全部靠左连续排列的二叉树。

核心条件

  1. 除最后一层外,每一层都被填满(节点数达到最大)。

  2. 最后一层的节点从左到右依次排列,中间不能有空缺。

举例

1

2 3

4 5 6

重要性质

  • 可用数组高效存储:根节点下标1,节点i的左孩子为2i,右孩子为2i+1。

  • 节点数n与高度h满足:2h−1≤n<2h。

  • 叶子节点只能出现在最后两层,且最后一层的叶子节点靠左连续。

相关推荐
晓蛋5 天前
c语言指的是什么意思
c语言·编译器·编程开发·集成开发环境·程序实例
倒头就睡的小比特5 天前
算法竞赛C++常用的STL
c++·算法
weilx12345 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
傲世仙尊5 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
牵猫散步的鱼儿5 天前
重载、重写(覆盖)、重定义区别
c语言
伞伞悦读5 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
phltxy5 天前
C 语言指针:从内存地址到灵活的数据访问
c语言
Smileyqp沛沛5 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
m0_547486665 天前
《数据结构教程》全套 PPT课件2026
数据结构