学校-二叉树相关操作复习笔记
二叉树相关操作复习笔记
一、二叉树的基本结构定义
// 常见的二叉树节点结构定义 |
二、二叉树的创建
1. 基于带虚节点的先序序列创建
// 根据带虚结点的先序序列创建二叉树(*表示空节点) |
分析:
- 利用先序遍历的思想(根左右),通过递归方式创建二叉树
- 虚节点
*用于标识空节点,解决了二叉树创建时的歧义问题 - 字符串通过引用传递并不断截取,实现了序列的顺序处理
三、二叉树的遍历
1. 层次遍历(广度优先遍历)
void LevelTraverse(BiTNode* T){ |
分析:
- 核心思想是使用队列实现按层次访问节点
- 过程:根节点入队→队头节点出队并访问→其左右孩子依次入队→重复直至队空
- 时间复杂度 O (n),空间复杂度 O (n)(最坏情况为满二叉树的最后一层)
2. 先序遍历(递归)
// 先序遍历打印叶节点示例 |
分析:
- 先序遍历顺序:根节点→左子树→右子树
- 递归实现简洁,利用函数调用栈保存节点状态
3. 非递归遍历
先序非递归遍历
void PreorderTraversal( BinTree BT ){ |
中序非递归遍历
void InorderTraversal( BinTree BT ){ |
后序非递归遍历(带标志位)
void PostorderTraversal( BinTree BT ){ |
分析:
- 非递归遍历需借助栈模拟递归过程
- 先序:根节点先出栈访问,再右后左入栈
- 中序:左子树全部入栈后,出栈访问根节点,再处理右子树
- 后序:需标记节点是否已处理右子树,确保左右子树都处理完再访问根节点
四、二叉树的常用属性计算
1. 二叉树的深度(高度)
int Depth(BiTree Tree){ |
分析:
- 递归思想:树的深度等于左右子树中深度较大者加 1
- 时间复杂度 O (n),需要遍历所有节点
2. 叶子节点数统计
int LeafCount(BiTree T){ |
3. 度为 1 的节点数统计
int CountSingle(BiTNode *T){ |
4. 节点总数统计
int NodeCountOfBiTree ( BiTree T){ |
5. 二叉树的最大宽度
int MaxWidth(BiTree T){ |
分析:
- 利用层次遍历思想,统计每一层的节点数
- 每一层处理前,队列中元素个数即为当前层节点数
- 比较各层节点数,取最大值即为最大宽度
五、由遍历序列构造二叉树
先序序列和中序序列构造二叉树
BiTNode* CreateBT(int* pre, int *in, int n){ |
分析:
- 核心原理:先序序列第一个元素是根节点,中序序列中根节点左侧为左子树,右侧为右子树
- 递归过程:找到根节点→划分左右子树范围→分别构建左右子树
- 时间复杂度 O (n²)(查找根节点位置耗时 O (n)),可通过哈希表优化为 O (n)
总结
- 递归是二叉树操作的核心思想:创建、遍历、属性计算等都可通过递归实现
- 辅助数据结构的应用:层次遍历用队列,非递归遍历用栈
- 遍历序列的特性:不同遍历序列组合可唯一确定二叉树(如先序 + 中序、后序 + 中序)
- 边界条件处理:空树(NULL)是各类操作的重要边界条件,需优先判断
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 好的好的378的博客!
评论
