数据结构探险之树篇-慕课网
C-PLUS-PLUS_STUDY/IMOOC_DATA_STRUCTOR_EXPLORE_CPP/l04_tree at master · laputa-er/C-PLUS-PLUS_STUDY · GitHub
课程从树的实现原理角度讲解了树的相关概念,着重讲解了二叉树三种遍历方式的原理,并通过编码实践,进一步说明二叉树使用数组和链表方式的编程技巧,以及前序遍历、中序遍历和后序遍历递归实现
1 树的基本概念
树是节点的有限集合。
1.1 基础概念
孩子:一个节点的直接子节点称为这个节点的孩子。
双亲:节点的父节点,称为这个节点的双亲。
度:一个节点的字节点的数量。
叶子:终端节点。
根:外界能访问到的这个树数据结构的入口节点。
祖先: 一个节点从父节点往上一直到跟节点之间的所有节点都是这个节点的祖先。
子孙: 一个节点从子节点往下一直到叶子节点都是它的子孙。
节点深度: 一个节点所在的层数。
树的深度: 一个树中深度最大的节点的深度就是这个树的深度。
森林:多个树的集合构成森林。
1.2 二叉树
描述:二叉树是一种特殊的树,它的所有节点的度都小于等于2。
1.2.1 二叉树遍历
前序遍历: 根 -> 左子 -> 右子。
中序遍历: 左子 -> 根 -> 右子
后序遍历: 左子 -> 右子 -> 根
1.3 用途
- 压缩软件:赫夫曼编码。
- 象棋、围棋等游戏软件
2 二叉树数组实现
2.1 原理
如果一个树是完全二叉树,就很容易转换为数组,反过来也可以将数组还原为二叉树。为了让所有二叉树都可以可以和数组相互转换,可以用一个“空”值填上二叉树中“缺失”的节点,从而构成一个完全二叉树。
例如,[3, 5, 8, 2, 6, 0, 7],构建的树如下
这时,下标为 N 的父节点,左子节点为 N 2 + 1,右子节点下标为 N 2 + 2。
2.2 实现
- 树的创建和销毁
- 树中节点的搜索
- 树中节点的添加和删除
- 树中节点的遍历
1 | . |
Tree.h
1 |
|
Tree.cpp
1 |
|
main.cpp
1 |
|
3 二叉树链表实现
3.1 原理
说明: 和使用数组相比,使用链表来实现树存在以下区别
- 删除一个节点必须同时删除其子孙节点
- 清空树需要遍历整个树分别释放每个节点的内存
- 遍历方式分前序、中序、后序三种(数组实现只有一种,不是这三种的任何一种)
建议:不在树的第一个节点上放有意义的值。
3.1.1 节点要素
- 索引
- 数据
- 左孩子指针
- 右孩子指针
3.1.2 遍历
前序:根 -> 左子 -> 右子
中序:左子 -> 根 -> 右子
后序:右子 -> 左子 -> 根
3.2 实现
1 | . |
main.cpp
1 |
|
Tree.h
1 |
|
Tree.cpp
1 |
|
Node.h
1 |
|
Node.cpp
1 |
|