考研数据结构408备考—第五章树与二叉树(1)

469 阅读5分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

考研数据结构408备考—第五章树与二叉树(1)

大纲

树的基本概念
树的存储结构
数和森林的遍历
二叉树的定义和性质
二叉树的存储结构
二叉树的遍历
线索二叉树
树与二叉树的相互转换
树与二叉树的应用
	并查集
	二叉排序树
	平衡二叉树
	哈夫曼(Huffman)树

重点

二叉树的四种遍历
二叉树的性质
二叉排序树
平衡二叉树
哈夫曼树

难点

二叉树的后序遍历非递归实现
线索二叉树
平衡二叉树的平衡调整

考研数据结构树.png

一、树的基本概念

定义:

N(N>0)个结点的有限集合,对任意非空树应满足

  • 1 .有且仅有一个特定的称为根的结点
  • 2 .当N>1时,其余结点可分为m(m>0)个互不相交的有限集合T1、T2、……、Tm, 其中每个集合本身又是一棵树,并且称为根结点的子树 树的特点:
  • 1 .树的定义是递归的,是一种递归的数据结构
  • 2 .树在逻辑结构上属于非线性结构
  • 3 .树的根节点没有前驱结点,除根节点以外的所有结点有且只有一个前驱结点
  • 4.树的叶子结点没有后继结点,除叶结点以外的所有的结点都有一个或多个后继结点

image.png

基本术语:

  • 以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

image.png

  • 树中两个结点之间所经过的结点序列构成两结点之间的路径
  • 路径长度是路径上所经过的边的个数,如结点A和结点K的路径长度为3 ,中间经过结点B和结点E
  • 有序树是树中任意结点的子结点从左到右是有次序的,不能交换
  • 无序树是树中任意节点的子结点之间没有顺序关系
  • 森林是m(m>0)课互不相交的树的集合 image.png 注意:
  • 树中分支是有向的,故树中路径也是从双亲结点指向孩子结点,同一双亲结点的两个孩子结点之 间不存在路径
  • 以上概念无需特殊记忆,考研不考纯概念题,上述概念练习多了自然就记住了

树的性质:

  • 1 .树中结点数等于所有结点的度数加1,即结点数=边数+1=所有结点度数+1

image.png

image.png

image.png

以上性质要在理解的基础上记住,考研经常会考计算题

二、树的存储结构

1.双亲表示法

image.png 采用一组连续空间来存储每个结点,同时在每个结点中 增设一个伪指针,指示其双亲结点在数组中的位置

image.png

双亲表示法存储结构代码实现
//树的双亲表示存储结构 
#define MAXSIZE 100
typedef struct{
	ElemType data;
	int parent;
}PTNode;

typedef struct{
	PTNode nodes[MAXSIZE];
	int n;
}PTree; 

注意

  • 该存储结构利用了每个结点只有唯一双亲的性质
  • 该结构通过结点找双亲时 间复杂度0(1),通过双亲找孩子需遍历整个数组,时间复杂度0(n)

2.孩子表示法

image.png 每个结点的孩子结点都用单链表链接起来形成一个线性结构

image.png 注意:

  • 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.孩子兄弟表示法

image.png 每个结点包含三部分内容:指向第一个孩子结点的指针、结点值、指向结点下一个兄弟结点的指针。

image.png 注意:

  • 孩子兄弟表示法又称二叉树表示法,即以二叉链表作为树的存储结构
  • 该方法优点是方便地实现了树转换为二叉树的操作,易于查找孩子结点
  • 缺点是从当前结点查找双亲结点比较麻烦
孩子兄弟表示法存储代码实现
//3.孩子兄弟表示法存储结构 
 typedef struct CSNode{
 	ElemType data;
 	struct CSNode *firstchild,*nextsibling;
 }CSNode,*CSTree;