5.1 数的逻辑结构
5.1.1 数的定义和基本术语
1、树的定义
n(n>=0)个结点的有限集合。当n=0时,称为空树;任意非空树满足:
1)有且仅有一个特定的称为根的结点;
2)当n>1时,除根结点之外的其余结点被分成m(m>0)个互不相交的有限集合,其中每个集合是一棵树,并称为根结点的子树。
树中将数据元素称为结点。
2、树的基本术语
结点的度:某结点所拥有的子树的个数。
数的度:树中各结点度的最大值。
叶子结点:度为0的结点。
分支结点:度不为0的结点。
孩子结点:某结点的子树;该结点为双亲结点;具有同一个双亲的孩子结点互为兄弟结点。
路径:结点ni是结点ni+1的双亲(1<=i<k),把n1,n2,....,nk称为一条有n1至nk的路径。
路径长度:路径上经过的边数。
祖先:如果从x到y有一条路径,则x是y的祖先;y是x的子孙。
结点的层数:规定根结点的层数为1。
树的深度(高度):树中所有结点的最大层数。
层序标号:将树中结点按照从上层到下层,同层从左到右的次序依次给他们编以从1开始的连续自然数。
有序树:如果一棵树中结点的各子树从左到右是有次序的,即若交换了结点各个子树的相对位置,则构成不同的树;反之为无序树。
森林:m>=0棵互不相交的树的集合。任一棵树删去根结点就变成森林。
5.1.2 树的抽象数据类型定义
ADT Tree
Data
Operating
InitTree 功能:初始化一棵树 后置条件:构造一棵树
DestroyTree 销毁一棵树 释放该树占用的存储空间
PreOrder 前序遍历树 树保持不变
PostOrder 后序遍历树 树保持不变
LeverOrder 层序遍历树 树保持不变
endADT
5.1.3 树的遍历操作
定义:从根结点出发,按照某种次序访问树中所有结点,使得每个结点被访问一次且仅被访问一次。
1、前序遍历 A B D E I F C G H
树空,返回;否则
1)访问根结点
2)按照从左到右的顺序前序遍历根结点的每一棵树
2、后序遍历 D I E F B G H C A
树空,返回:否则
1)按照从左到右的顺序后序遍历根结点的每一棵树
2)访问根结点
3、层序遍历 A B C D E F G H I
从树的第一层开始,自上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。
5.2 树的存储结构
5.2.1 双亲表示法
5.2.2 孩子表示法
5.2.3 双亲孩子表示法
5.2.4 孩子兄弟表示法
5.3 二叉树的逻辑结构
5.3.1 二叉树的定义
n(n>=0)个结点的有限集合,该集合或者为空集(称空二叉树),由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树。
特点:1)每个结点最多有两棵子树; 2)二叉树是有序的,其次序是不能任意颠倒的,即使树中的某个结点只有一棵子树,也要区分它是左是右。
二叉树和树是两种结构。
二叉树有五种基本形态:
1)空二叉树
2)只有一个根结点
3)根结点只有左子树
4)根结点只有右子树
5)根结点既有左子树又有右子树
1、斜树
所有结点都只有左子树的二叉树称为左斜树;所有结点都只有右子树的二叉树称为右斜树。
斜树的结点个数与深度相同。
2、满二叉树
定义:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上。
特点:1)叶子只能出现在最下一层; 2)只有度为0和度为2的结点。
3、 完全二叉树
定义:对一棵具有n个结点的二叉树按层序编号,若编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同。
特点:1)叶子结点只能出现在最下两层,且最下层的叶子结点都集中在二叉树左侧连续的位置; 2)如果有度为1的结点,只可能有一个,且该结点只有左孩子。
5.3.2 二叉树的基本性质
1、二叉树的第i层上最多有2^(i-1)个结点(i>=1)
2、在一棵深度为k的二叉树中,最多有2^k-1个结点,最少有k个结点。
3、在一棵二叉树中,如果叶子结点的个数为n0,度为2的结点个数为n2,则n0=n2+1.
4、具有n个结点的完全二叉树的深度为|log2(n)|+1
5、对一棵具有n个结点的完全二叉树中的结点从1开始按层序编号,则对于任意的编号为i(1<=i<=n)的结点,有
1)i>1,结点i的双亲编号为|i/2|;否则结点i是根结点,无双亲。
2)2i<=n,结点i的左孩子编号为2i;否则结点i无左孩子。
3)2i+1<=n,结点i的右孩子编号为2i+1;否则无右孩子。
5.3.3 二叉树的抽象数据类型定义
ADT BiTree
Data
Operation
InitBiTree 功能:初始化一棵二叉树 后置条件:构造一棵空的二叉树
DestroyBiTree 销毁一棵二叉树 释放二叉树占有的存储空间
PreOrder 前序遍历二叉树 二叉 树保持不变
InOrder 中序遍历二叉树 二叉 树保持不变
PostOrder 后序遍历二叉树 二叉树保持不变
LeverOrder 层序遍历二叉树 二叉树保持不变
endADT
5.3.4 二叉树的遍历操作
1、前序遍历 A B D G C E F
二叉树空,返回;否则
1)访问根结点
2)前序遍历根结点的左子树
3)前序遍历根结点的右子树
2、中序遍历 D G B A E C F
二叉树空,返回;否则
1)中序遍历根结点的左子树
2)访问根结点
3)中序遍历根结点的右子树
3、后序遍历 G D B E F C A
二叉树空,返回:否则
1)后序遍历根结点的左子树
2)后序遍历根结点的右子树
3)访问根结点
4、层序遍历 A B C D E F G
从二叉树的第一层开始,自上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。