序言
1. 内容介绍
本章详细介绍了树、二叉树、二叉树的遍历和树的转换
2. 理论目标
- 掌握树的定义
- 掌握二叉树的原理
- 掌握二叉树的遍历
- 掌握树的转换。
3. 实践目标
- 实现树和二叉树的多种物理结构代码。
4. 实践案例
无
5. 内容目录
- 树
- 二叉树
- 二叉树的遍历
- 树的转换
第1节 树
学习数据结构与算法的必要性
为什么学习树
什么是树
树的定义:树是由根结点和若干棵子树构成的树形结构
注意:
1.树是n(n>=0)个结点的有限集
2.当n>0时有且只有一个根结点
3.除根结点外,其余结点构成的互不相交的集合仍是一棵树
树的分类:
按是否有序 (有序树、无序树)
按相对关系 (树 及其子树)
按含有的结点数量 (空树、非空树)
什么是空树
空树的定义:空树是不含任何结点的树 (树的特例)
内涵:结点个数为0
子树的定义:子树是树中一个结点以及其下面所有的结点构成的树
内涵:1、树中一个结点及其下所有结点构成的集合
2、每一个集合又是一棵树
树的作用:
建立程序之间的调用关系
实现内存的持久化管理
分治及递归算法使用树表达、辅助理解
提高搜索效率
结点的定义:结点是树中的数据元素
内涵:树中每个元素
外延:按结点层次—— 双亲结点(父结点)、孩子结点、祖先结点、子孙结点、兄弟结点、堂兄弟结点
按位置—— 根结点、叶结点、分支结点
结点的度定义:结点的度是结点含有子树的个数
内涵:一个结点含有的子树的个数
什么是根结点、分支结点、叶结点
什么是父结点、孩子结点、兄弟结点
父结点: 是指当前结点的直接上级结点
孩子结点: 是指当前结点的直接下级结点
兄弟结点: 是有相同父结点的结点
什么是祖先结点、子子孙结点、堂兄弟结点
祖先结点: 是当前结点的直接及间接上级结点
子孙结点: 是当前结点的直接及间接下级结点
堂兄弟结点: 是父结点在同一层的结点
结点的层次: 是从根结点到某结点所经路径上的层次数
树的深度: 是树中所有结点层次的最大值
树的度: 是树内各结点度的最大值
什么是森林
森林的定义:森林是指0或多棵互不相交树的集合
内涵:m(m>=0)棵互不相交树的集合
树的抽象数据类型
如何实现树的存储
什么是双亲表示法
双亲表示法的定义: 以一组连续空间存储树的结点,在每个结点中,附设一个指示器指 示其双亲结点到链表中的位置
双亲表示法的结点结构:
如何使用双亲表示法实现树的存储
如何使用代码实现双亲表示法
双亲表示法的特点
由于根结点是没有双亲,约定根结点的位置域为-1.
根据结点的parent指针很容易找到它的双亲结点。所用时间复杂度为O(1)
直到parent为-1时,表示找到了树结点的根
缺点:如果要找到孩子结点,需要遍历整个结构才行
双亲表示法改进
双亲表示法的定义
1.增加结点最左边的孩子域易于得到结点的孩子
2.如果没有孩子的结点,这左孩子域就置为-1
双亲表示法的结点结构
如何使用双亲表示法实现树的存储
为什么使用孩子表示法实现树的存储
如何存储树中孩子结点
如何存储树中孩子结点
什么是孩子表示法
如何使用代码实现孩子表示法
为什么使用孩子兄弟表示法
什么是孩子兄弟表示法
孩子兄弟表示法的定义
1.采用链式存储,描述结点的孩子、兄弟关系
2.设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟
孩子兄弟表示法的结点结构
如何使用孩子兄弟表示法实现树的存储
如何使用代码实现孩子兄弟表示法
第2节 二叉树
什么是二叉树
每个结点最多有两个孩子结点,不存在度数大于2的结点,孩子结点是有顺序的,次序不能任意颠倒,即使只有一个孩子结点,也要区分左右
定义:二叉树是每个结点最多有左、右两棵子树且严格区分顺序的树形结构
1、每个结点最多有两棵子树
2、严格区分左右子树
按存储内容(空二叉树、斜树、满二叉树、完全二叉树)
按应用(二叉排序树、哈弗曼树)
定义:子树是树中一个结点以及其下面所有的结点构成的树
内涵:
1、树中一个结点及其下所有结点构成的集合
2、每一个集合又是一棵树
什么是左、右子树
二叉树的五种形态
二叉树的作用
二叉树的抽象数据类型
什么是满二叉树
什么是满二叉树
定义:满二叉树是最后一层是叶子结点,其余结点度是2的二叉树
1、叶子结点只能出现在最后一层
2、非叶子结点都有两个子结点
什么是完全二叉树
1)只有最后两层有叶子结点
(2)只有最下面一层有度数小于2的结点
(3)最后一层的叶子结点集中在左边连续的位置
什么是完全二叉树
定义:完全二叉树是在一棵满二叉树基础上自左向右连续增加叶子结点得到的二叉树
1、叶子结点只能出现在最后两层
2、最后一层的叶子结点集中在左边连续的位置
3、除最后一层是一棵满二叉树
二叉树的性质
性质1:在非空二叉树的i层上,至多有2i-1个结点(i>=1)
在深度为K的二叉树上最多有(2^k)-1个结点(k>=1)
内容小结
完全二叉树结点的编号方法是从上到下,从左到右
根节点为1号结点
设完全二叉树的结点数为n,某结点编号为I
若 i=1,则该结点是二叉树的根,无双亲,否则,其双亲结点是编号为 1/2的结点
若 2i>n,则该结点无左孩子,否则,其左孩子结点是编号为 2i 的结点
若 2i+1>n,则该结点无右孩子结点,否则,其右孩子结点是编号为2i+1 的结点
如何实现二叉树的顺序存储结构
什么是二叉链表
如何使用二叉链表
第3节 二叉树的遍历与树的转换
什么是二叉树的遍历:
定义:二叉树的遍历是指沿着某条路线依次对二叉树中每个结点访问且仅访问一次的操作
1、沿着某条路线依次访问二叉树中的每个结点
2、每个结点仅访问一次
二叉树遍历的分类:
先序遍历 中序遍历 后序遍历
二叉树遍历的作用
将二叉树中的结点能够按照某种次序线性化,便于计算机处理。
先序遍历定义:先序遍历是遵循根、左、右访问顺序的二叉树的遍历
遵循根、左、右的访问顺序
如何实现二叉树的先序遍历
为什么要使用中序遍历
什么是中序遍历
定义: 中序遍历是指遵循左、根、右访问顺序的二叉树的遍历
如何实现二叉树的中序遍历
为什么要使用后序遍历
后序遍历定义:中序遍历是指遵循左、右、根访问顺序的二叉树的遍历
如何实现二叉树的后序遍历
什么是路径
定义:路径是从一个结点到另一个结点之间的分支序列
内涵:从一个结点到另一个结点的分支序列
什么是路径长度
定义:路径长度是指一个结点到另一个结点所经过分支的数目
内涵:一个结点所经过分支的数目
什么是树的路径长度
定义:树的路径长度是指从树根到每个结点的路径长度之和
内涵:从树根到每个结点的路径长度之和
如何计算树的路径长度
什么是结点的权
什么是结点的权
定义:结点的权是指结点中存储的有特定意义的数值
内涵:结点中存储的有特定意义的数值
什么是结点的带权路径长度
什么是结点的带权路径长度
定义:结点的带权路径长度是指从树根到某结点的路径长度和该结点的权的乘积
内涵:从树根到该结点的路径长度和结点上权的乘积
什么是树的带权路径长度
定义:树的带权路径长度是指树中所有叶子结点的带权路径长度之和=(WPL)
内涵:树中所有叶结点的带权路径长度之和
如何计算树的带权路径长度
为什么要构建哈夫曼树
什么是哈夫曼树
定义:哈夫曼树是指由给定带权叶子结点构造的所有二叉树中树的带权路径长度最小的二叉树
1、带权叶子结点构成的二叉树
2、带权路径长度最小
如何构建哈夫曼树
什么是哈夫曼编码
定义:哈夫曼编码是指由哈夫曼树构造的二进制编码
内涵:由哈夫曼树构造的二进制编码
如何编制哈夫曼编码
输出哈夫曼树代码