目录
2.5.3前/中/后序线索二叉树中找指定节点*p的前/中/后序前驱后继⭐
1.树、森林
1.1定义和基本术语
1.1.1结点、树的关系和属性
关系描述:
祖先结点?子孙结点?
双亲结点(父节点)?孩子结点?
兄弟结点?堂兄弟结点?
两个结点之间的路径(只能从上往下)?路径长度(经过几条边)?
属性描述:
结点的层次(深度,默认从1开始)——从上往下数
结点的高度――从下往上数
结点的度――有几个孩子(分支) (非叶子结点度>0;叶子结点度=0)
树的高度(深度)——总共多少层
树的度――各结点的度的最大值
1.1.2基本概念
▶树的定义
树的数学描述:
树的递归定义:树是由根节点和若干互不相交的子树构成。
m叉树:每个结点最多只能有m个孩子的树(任意结点的度≤m)
树这种数据结构的应用:家谱、文件系统、思维导图……
▶空树 VS 非空树
空树∅的特性:结点数为0;
非空树的特性:
有且仅有一个根节点;没有后继的结点称为“叶子结点”(或终端结点),有后继的结点称为“分支结点”(或非终端结点);除了根节点外,任何一个结点都有且仅有一个前驱,每个结点可以有0个或多个后继。
▶有序树 VS 无序树
有序树――逻辑上看,树中结点的各子树从左至右是有次序的,不能互换;
无序树――逻辑上看,树中结点的各子树从左至右是无次序的,可以互换。
具体看你用树存什么,是否需要用结点的左右位置反映某些逻辑关系
▶认识二叉树
二叉树的5种合法状态:
▶树 VS 森林
森林是m (m≥0)棵互不相交的树的集合。
eg:全国所有人家的家谱。
考点:树和森林相互转化⭐
1.2树的性质
1.树的结点个数=各非根结点度数和 +1(1:root)
只有根节点没有分支。
2.度为m的树 VS m叉树
3. 度为m的树第 i 层至多有 个结点
m叉树第 i 层至多有 个结点
4.高度为h的m叉树至多有个结点
这个就是等比数列求和,最多就是每一个结点的子结点数都为m,这个等比数列的公比为m,首项都是1,根据等比数列1-m为负数,1-q^n也为负数,这里公式就直接调换位置了,结果不变。
等比数列前n项和:
5.高度为h的m叉树至少有h个结点;高度为h、度为m的树至少有h+m-1个结点。
6.具有n个结点的m叉树的最小高度为
高度最小,则就是尽量将结点安排在较小的层上面,也就是每一个结点的子结点数尽量都为m,设
,求出m即可,至于结果向下取整,是因为这个结果计算的不一定为整数,因为我们这里的条件是最小高度,则就是每层结点个数,除了最后一层,都达到最大数,那么这个最后一层可能就不满足结点最大数,那么使用这个公式计算的结果就会出现小数,但是最后一层也是有结点的也算一层,所以向下取整。
1.3树的存储结构
1.3.1双亲表示法(顺序存储)
每个结点保存指向双亲的“指针”(数组下标)。
//双亲表示法
#define MAX_TREE_SIZE 100 //树中最多节点个数
typedef struct { //树节点的定义
ElemType data; //数据元素
int parent; //指向双亲的“指针”(数组下标)
}PTNode; //parent node
typedef struct{ //树的类型定义
PTNode nodes[MAX_TREE_SIZE]; //双亲表示法(静态分配的顺序存储)
int n; //节点数
}PTree;
PTree T; //开辟了 100*sizeof(PTNode)+ sizeof(int) 大小的空间
1.3.2孩子表示法(顺序+链式存储)
顺序存储各个节点,每个结点中保存孩子链表头“指针”(数组下标)
struct CTNode{//child next
int child; //孩子在节点数组中的位置
struct CTNode *next;//指向下一个孩子
};
typedef struct{
ElemType data; //数据元素
struct CTNode *firstchild;//指向第一个孩子
}CTBox; //child next box
typedef struct{
CTBox nodes[MAX_TREE_SIZE];
int n,r; //结点数和根的位置
}CTree;
1.3.3孩子兄弟表示法(链式存储——二叉链表)
typedef struct CSNode{ //Child sibling(兄弟姐妹) node
ElemType data; //数据域
struct CSNode *firstchild,*nextsibling; //第一个孩子和右兄弟指针 ——二叉链表
}CSNode, *CSTree;
1.4树和森林的相互转换与遍历
1.4.1树和森林的相互转换
孩子兄弟表示法的应用
二叉树和森林的相互转换——用二叉链表存储森林
1.4.2树和森林的遍历
1.树的遍历
树的先根遍历:
树的后根遍历:
树的层次遍历:
2.森林的遍历