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。

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

相关推荐
江畔柳前堤1 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
Figo_Cheung1 小时前
Figo基于RNC理论的宇宙演化第七纪元猜想
开发语言·php
会周易的程序员2 小时前
5Draft(五帝)测试报告
服务器·c++·分布式·raft·共识算法·共识·算力服务器
UIU1142 小时前
scanf与cout的误区:探究其内部的机制
c++·学习·c#·scanf
闻缺陷则喜何志丹2 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统
泡海椒2 小时前
JQuick-Curl 二次开发:自定义解析器、扩展点开发指南,如何把框架能力真正变成团队资产
java·开发语言·okhttp·maven
bnmoel3 小时前
C++ 基础入门篇(一):命名空间,输入&输出,缺省参数,函数重载
c++·函数重载·语法·命名空间·缺省参数
青山木3 小时前
Hot 100 --- 数组中的第K个最大元素
java·数据结构·算法·排序算法
WWJA王文举3 小时前
FreeRTOS事件组和任务通知详解:为什么任务通知比队列更轻量?
开发语言·php
Zixhy3 小时前
多点巡检机器人项目技术总结
linux·c++·机器人·自动驾驶