第5章--树与二叉树

本文详细介绍了树的基本概念,包括树的定义、术语和性质。接着探讨了树的存储结构,如双亲表示法、孩子表示法和二叉链表表示法。还讲解了树的遍历方法,如先根遍历和后根遍历。此外,重点阐述了二叉树的特性,包括满二叉树和完全二叉树,以及二叉树的遍历方法,如先序、中序、后序和层次遍历。文章还涉及了线索二叉树、森林转换为二叉树以及哈夫曼树的构造和编码。最后提到了并查集的概念及其基本操作。
摘要由CSDN通过智能技术生成

目录

5.1 树的基本概念

5.1.1 树的定义

5.1.2 树的几种术语

5.1.3 树的性质

5.2 树的表示

5.2.1 树的存储结构

1. 树的顺序存储---双亲表示法

 2.  孩子表示法​                                                                   

 3.  二叉链表表示法---树的兄弟表示法

 5.3 树的遍历

5.3.1 先根遍历

5.3.2 后根遍历

5.4 二叉树

5.4.1 二叉树的定义

满二叉树

完全二叉树

5.4.2 二叉树的性质

5.5 二叉树的存储结构

5.5.1 二叉树的顺序存储结构

5.5.2 二叉树链式存储结构

5.6 二叉树的遍历

5.6.1 先序遍历

5.6.2 中序遍历

5.6.3 后序遍历

5.6.4 层次遍历

5.6.5 线索二叉树

1. 线索二叉树结点结构

2. 通过中序遍历对二叉树进行线索化

3. 中序线索二叉树的遍历

5.7 森林

5.7.1 森林转换为二叉树

 5.8 哈夫曼树

5.8.1 哈夫曼树的定义

5.8.2 哈夫曼树的构造

5.8.3 哈夫曼编码

5.8.4 并查集

 1. 并查集的结构定义

2. 并查集的初始化操作

3. Find操作

4. Union操作


5.1 树的基本概念

5.1.1 树的定义

树是n个结点的有限集。当n=0时,称为空树。在任意一棵非空树中应满足:

  1. 有且仅有一个特定的称为根的结点。
  2. 当n>1时,其余结点可分为m个互不相交的有限集{T},集合本身又是一棵树,并且称为根的子树。

显然,树的定义是递归的,即在树的定义中又用到了其自身,树是一种递归的数据结构。书作为一种逻辑结构,同时也是一种分层结构,具有以下两个特点:

  1. 树的根结点没有前驱,除根结点外的所有结点有且仅有一个前驱。
  2. 树中所有结点可以有零个或多个后继。

5.1.2 树的几种术语

  1. 树中一个结点的孩子个数称为该结点的度,树中最大度数称为树的度。
  2. 结点的深度是从根结点开始自顶向下逐层累加。
  3. 结点的高度是从叶结点开始自底向上逐层累加。
  4. 树的高度/深度是树中最大的深度/高度。
  5. 树的路径长度是指树根到每个结点的路径长的总和。

5.1.3 树的性质

  1. 树中结点数n等于所有结点的度数之和加1。n=E+1
  2. 度为m的树(即m叉树)中第i层上至多有m^{^{i-1}}个结点。
  3. 高度为h的m叉树至多有m^{h}-1/m-1个。
  4. 具有n个结点的m叉树最小高度为\left \lceil log_{m}\left (n \left ( m-1\right ) \right ) \right \rceil

5.2 树的表示

5.2.1 树的存储结构

1. 树的顺序存储---双亲表示法

//树的顺序存储法(双亲表示法)
#define MAX_Tree_Size 100//树的最多结点数
typedef struct{	//树的结点定义
	Elemtype data;
	int parent;
}PTNode;
typedef struct {// 树的类型定义
	PTNode nodes[MAX_Tree_Size];
	int n;//树的结点数
}PTree;

 2.  孩子表示法                                                                   

 3.  二叉链表表示法---树的兄弟表示法

//树的兄弟表示法--二叉链表表示法
typedef struct CSNode {
	Elemtype data;
	struct CSNode* firstchild, * nextibling;//第一个孩子和右兄弟指针
}CSNode, * CSTree;

 5.3 树的遍历

5.3.1 先根遍历

  • 若树非空,访问根结点。
  • 依次遍历子树并遵循先根后结点的原则。

对应二叉树的先序遍历:

  • 先访问完根结点再依次访问左结点(树的孩子结点)和右结点(树的根结点)。
//树的先根遍历
void PreOrder(TreeNode* R)
{
	if (R != NULL)
		visit(R);
	while (R还有下一个子树T)
		PreOrder(T);
}

5.3.2 后根遍历

  • 先遍历同一结点不同孩子。
  • 再访问双亲结点

对应二叉树中序遍历为:

  • 访问完根结点(树双亲结点)再问右孩子(树的兄弟结点为根结点)。
  • 访问完左子树(树的孩子结点)访问根结点。
//树的后根遍历
void PostOrder(TreeNode* R)
{
	if (R != NULL) {
		while (R还有下一个子树)
			PostOrder(T);
		visit(R);
	}	
}

5.4 二叉树

5.4.1 二叉树的定义

m=2的树即为二叉树,它有着所有有关树的定义;二叉树是有序树,若将左右子树颠倒,则成为另一颗完全不同的二叉树。即使树中的结点只有一棵子树,也要区分它是左子树还是右子树。二叉树可以为一颗空树。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值