这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战
考研数据结构408备考—第五章树与二叉树(1)
大纲
树的基本概念
树的存储结构
数和森林的遍历
二叉树的定义和性质
二叉树的存储结构
二叉树的遍历
线索二叉树
树与二叉树的相互转换
树与二叉树的应用
并查集
二叉排序树
平衡二叉树
哈夫曼(Huffman)树
重点
二叉树的四种遍历
二叉树的性质
二叉排序树
平衡二叉树
哈夫曼树
难点
二叉树的后序遍历非递归实现
线索二叉树
平衡二叉树的平衡调整
一、树的基本概念
定义:
N(N>0)个结点的有限集合,对任意非空树应满足
- 1 .有且仅有一个特定的称为根的结点
- 2 .当N>1时,其余结点可分为m(m>0)个互不相交的有限集合T1、T2、……、Tm, 其中每个集合本身又是一棵树,并且称为根结点的子树 树的特点:
- 1 .树的定义是递归的,是一种递归的数据结构
- 2 .树在逻辑结构上属于非线性结构
- 3 .树的根节点没有前驱结点,除根节点以外的所有结点有且只有一个前驱结点
- 4.树的叶子结点没有后继结点,除叶结点以外的所有的结点都有一个或多个后继结点
基本术语:
- 以K为例,根A到结点K的唯一路径上的任意结点称为K的祖先结点
- 结点B是结点K的祖先结点,结点K是结点B的子孙结点
- 祖先结点中最接近K的结点E称为K的双亲结点,而K为结点E的孩子结点
- 有相同双亲的结点称为兄弟结点,如K与L为兄弟结点
- 一个结点的孩子结点个数称为结点的度,如结点B度为2,结点D度为3
- 树中结点的最大度数称为树的度,如右图树的度为3
- 度大于0的结点称为分支结点(也称非终端结点)
- 度为0的结点称为叶结点(也称终端结点)
- 结点的层次从树根开始定义,根结点为 第1层,它的子结点为第2层,以此类推
- 树的高度(深度)是树中结点的最大层数,如下图中树的高度(深度)为4
- 树中两个结点之间所经过的结点序列构成两结点之间的路径
- 路径长度是路径上所经过的边的个数,如结点A和结点K的路径长度为3 ,中间经过结点B和结点E
- 有序树是树中任意结点的子结点从左到右是有次序的,不能交换
- 无序树是树中任意节点的子结点之间没有顺序关系
- 森林是m(m>0)课互不相交的树的集合
注意:
- 树中分支是有向的,故树中路径也是从双亲结点指向孩子结点,同一双亲结点的两个孩子结点之 间不存在路径
- 以上概念无需特殊记忆,考研不考纯概念题,上述概念练习多了自然就记住了
树的性质:
- 1 .树中结点数等于所有结点的度数加1,即结点数=边数+1=所有结点度数+1
以上性质要在理解的基础上记住,考研经常会考计算题
二、树的存储结构
1.双亲表示法
采用一组连续空间来存储每个结点,同时在每个结点中
增设一个伪指针,指示其双亲结点在数组中的位置
双亲表示法存储结构代码实现
//树的双亲表示存储结构
#define MAXSIZE 100
typedef struct{
ElemType data;
int parent;
}PTNode;
typedef struct{
PTNode nodes[MAXSIZE];
int n;
}PTree;
注意
- 该存储结构利用了每个结点只有唯一双亲的性质
- 该结构通过结点找双亲时 间复杂度0(1),通过双亲找孩子需遍历整个数组,时间复杂度0(n)
2.孩子表示法
每个结点的孩子结点都用单链表链接起来形成一个线性结构
注意:
- N个结点有N个孩子链表
- 该结构通过双亲找孩子时间复杂度0,通过结点找 双亲需遍历N个结点中孩子链表,时间复杂度0(n)
孩子表示法存储结构代码实现
//2.孩子表示法存储结构
typedef struct CTNode{ //孩子结点
int child;
struct CTNode *next;
}CTNode,*ChildPtr;
typedef struct CTBox{ //表头结构
ElemType data;
ChildPtr firstchild;
}CTBox;
typedef struct CTree{ //树结构
CTBox nodes[MAXSIZE];
int n;
}CTree;
3.孩子兄弟表示法
每个结点包含三部分内容:指向第一个孩子结点的指针、结点值、指向结点下一个兄弟结点的指针。
注意:
- 孩子兄弟表示法又称二叉树表示法,即以二叉链表作为树的存储结构
- 该方法优点是方便地实现了树转换为二叉树的操作,易于查找孩子结点
- 缺点是从当前结点查找双亲结点比较麻烦
孩子兄弟表示法存储代码实现
//3.孩子兄弟表示法存储结构
typedef struct CSNode{
ElemType data;
struct CSNode *firstchild,*nextsibling;
}CSNode,*CSTree;