数据结构——树和二叉树

目录

1.树、森林 

1.1定义和基本术语

1.1.1结点、树的关系和属性

1.1.2基本概念

1.2树的性质

1.3树的存储结构

1.3.1双亲表示法(顺序存储)

1.3.2孩子表示法(顺序+链式存储)

1.3.3孩子兄弟表示法(链式存储——二叉链表)

1.4树和森林的相互转换与遍历

1.4.1树和森林的相互转换

1.4.2树和森林的遍历

1.5哈夫曼树(Huffman Tree)

2.二叉树⭐⭐⭐

2.1 4种特殊的二叉树

2.2二叉树的性质

2.3二叉树的存储结构

2.3.1顺序存储

2.3.2链式存储

2.4二叉树的遍历

​2.4.1先中/后/序遍历

2.4.2层序遍历

2.4.3由遍历序列构造二叉树

2.5线索二叉树⭐⭐⭐

2.5.1概念、作用、存储结构(链式存储),手算⭐

2.5.2二叉树的线索化(建立线索)

2.5.3前/中/后序线索二叉树中找指定节点*p的前/中/后序前驱后继⭐

3.并查集(2022新增考点)

3.1三要素(逻辑结构、运算、存储结构)

3.1.1逻辑结构——集合

3.1.2运算——初始化、“并”与“查”

3.1.3存储结构——顺序存储

3.2并查集的“并”与“查”的优化

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-1}(i\geq1)个结点

 m叉树第 i 层至多有 m^{i-1}(i\geq1)个结点

4.高度为h的m叉树至多有\frac{m^{h}-1}{m-1}个结点 

 这个就是等比数列求和,最多就是每一个结点的子结点数都为m,这个等比数列的公比为m,首项都是1,根据等比数列1-m为负数,1-q^n也为负数,这里公式就直接调换位置了,结果不变。

m^{0}+m^{1}+m^{2}+...+m^{h-1}=\frac{m^{0}(1-m^{h})}{1-m}=\frac{m^{h}-1}{m-1}

等比数列前n项和:S_{n}=\frac{a_{1}(1-q^{n})}{1-q}=\frac{a_{1}-a_{n}q}{1-q}

5.高度为h的m叉树至少有h个结点;高度为h、度为m的树至少有h+m-1个结点。

6.具有n个结点的m叉树的最小高度为 \left \lceil log_{m}(n(m - 1)+1) \right \rceil

高度最小,则就是尽量将结点安排在较小的层上面,也就是每一个结点的子结点数尽量都为m,设\frac{m^{h}-1}{m-1}=n,求出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.森林的遍历

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值