数据结构第12讲:第6章(3)
bigC语言第12讲

WANGJINLING
指针是特殊类型的变量,其内容是变 合 量的地址。在使用前必须说明,说明某标 肥 识符是指针类型,并可指向某种类型的变 工 量或数据结构。
业 大 学
1、指针变量的定义 格式: type *pname1,…*pnamen;
标识符命名的指 针变量名
WANGJINLING
合 肥 指针指向对象的类型 工 int *p, *q; /* p、q是指向整型变量的指针业 */ 大 float *pfValue ,*pf; 学 /* pfValue和pf是指向浮点型的指针 */
类型长度
p1++; /*指向a后的整型单元*/ p1- -; /*指向a前的整型单元*/ p1+n; /*指向a后的n个整型单元*/
6.2 指针与数组
数组中的各元素按下标的顺序占据一段连续 的内存空间,数组名是这段连续内存的首地址, 指针访问数组元素非常方便。
WANGJINLING
6.2.1 指针与一维数组 通过指针引用数组元素有三个步骤:
指针标志
2、指针变量的赋值
① int a, *p=&a;
WANGJINLING
初始化
② int a=10,*p,*q; 注:*p=&a p=&a; 赋值语句 q=p; p=NULL
合 /*Error!*/ 肥 工 业 大 学
例:
#include <stdio.h> void main (void ) { int x ,*p; x=55; p=&x; printf ( “ %d, %u ”, x, *p) ; *p=65; printf ( “ %d, %u”, x, *p) ; }
WANGJINLING
数据结构各章概要

数据结构各章概要数据结构是计算机科学中非常重要的一个学科,其主要研究各种数据的组织方式和操作方法。
善于运用合适的数据结构可以提高算法的效率,并优化程序的性能。
本文将对数据结构的各个章节进行概要介绍,帮助读者了解不同章节的主要内容和应用。
第一章:引论在引论章节,我们将引入数据结构的基本概念和术语,例如什么是数据、数据项、数据对象等等。
同时,还将介绍数据结构的分类和基本操作,如搜索、遍历、插入、删除和排序。
这些基础知识是后续章节的基础。
第二章:线性表线性表是数据结构中最简单、最基本的一种结构。
其特点是数据元素之间的前驱和后继关系非常明确。
线性表可以用数组和链表两种方式实现。
在本章节中,我们将分别介绍顺序表和链表的实现原理、插入、删除、合并以及应用场景。
第三章:栈和队列栈和队列是两种特殊的线性表结构,它们对数据的访问具有限制性。
栈具有“先进后出”的特点,而队列则具有“先进先出”的特点。
在本章节中,我们将介绍栈和队列的实现方式以及常见的应用场景,如递归、表达式求值、广度优先搜索等。
第四章:串串是由零个或多个字符组成的有限序列,其长度可以为零。
在本章节中,我们将介绍串的定义和操作,包括字符串的模式匹配、模式识别和编辑操作。
串的相关算法在文本处理、计算机网络等领域具有广泛的应用。
第五章:数组和广义表数组是一种在内存中以连续方式存储的数据结构,它具有高效的随机访问特性。
广义表是线性表的一种扩展,可以包含表结构、原子结构以及其他广义表。
本章节将介绍数组和广义表的定义、操作和应用。
第六章:树树是一种非线性的数据结构,具有分层次、递归和层次遍历等特点。
在本章节中,我们将介绍树的基本概念、二叉树、树的遍历算法、平衡树以及树的应用,如编译器中的语法树、文件系统的目录结构等。
第七章:图图是一种复杂的非线性数据结构,由顶点集合和边集合组成。
在本章节中,我们将介绍图的各种表示方式,图的遍历算法、最短路径算法以及常用的图算法,如最小生成树算法和拓扑排序。
东南大学数据结构_Lec012

RecType *recptr[M+1] ; /* 记录指针向量,recptr[0]未用 */
struct BTNode *parent ; /* 指向父结点的指针 */
struct BTNode *ptr[M+1] ; /* 子树指针向量 */
} BTNode;
数据结构
5
B-树的查找过程
例:查找26 查找100
插入53
插入75
插入139
75
插入49,145
75
53
53 75
53 139 49 53 139 145
插入36
49 75 36 53 139 145
数据结构
插入101
49
75 139
36 53 101 145
12
B-树的删除操作
• 在B-树上删除一个关键字,首先应找到该关键字所在结点, 并从中删除之:
• 若该结点为最下层的非终端结点,且其中的关键字数目不少 于m/2,则删除完成,否则要进行“合并”结点的操作;
• 若所删关键字为非终端结点中的Ki,则可以指针Ai所指子树 中的最小关键字Y代替Ki ,然后在相应结点中删去Y。
• 讨论删除最下删层除5非5
B-树的结点类型定义
• 根据m阶B-树的定义,结点类型定义如下:
#define M 5 /* 根据实际需要定义B_树的阶数 */
typedef struct BTNode {
int keynum ;
/* 结点中关键字的个数 */
KeyType key[M+1] ;
/* 关键字向量,key[0]未用 */
第12讲 多路查找树、哈希表
• B-树和B+树
第12讲-网络分析

地址匹配
地址:网络上的空间位置,可通过门牌号、街道编码
等实现 在商业、犯罪控制、供需分析等常常使用
爆管分析
定义 水、油、气等物质网络上管道或点设备(法门、仪表等) 发生故障的分析问题。 目的 对该点断流,即检索出全部与该点直接相连的各种断流 设备 算法 基于矢量数据的爆管算法 基于栅格数据的爆管算法
网络示例
铁路、公路 电力网、电讯网 煤气管网 各种服务网络 航空网络 街道网络
为什么要使用网络分析
从甲地道乙地的最短 路径是什么? 如何设定一个服务中心? 特定位置的服务中心是的服务范围? 从一个位置到另一个位置的通行程度如何? 从出发地到目的地,有多少条可行路线? 如何在街道图上定位一个发生的事件?
Dijkstra算法思想
设G=(V,E)是一个带权有向图,把图中顶点集合V分成两
组,第一组为已求出最短路径的顶点集合(用 S 表示, 初始时S中只有一个源点,以后每求得一条最短路径 , 就 将加入到集合S中,直到全部顶点都加入到S中,算法就 结束了),第二组为其余未确定最短路径的顶点集合 (用U表示),按最短路径长度的递增次序依次把第二 组的顶点加入S中。在加入的过程中,总保持从源点v到 S中各顶点的最短路径长度不大于从源点 v到U中任何顶 点的最短路径长度。此外,每个顶点的距离,是从v到此顶点只包括S中的顶点为中间 顶点的当前最短路径长度。
Dijkstra算法具体步骤
(1)初始时,S只包含源点,即S={v},距离为0。U包含
除v外的其他顶点,U中顶点u距离为边上的权(若v与u有 边)或)(若u不是v的出边邻接点)。 (2 )从U 中选取一个距离 v 最小的顶点 k ,把k ,加入S 中 (该选定的距离就是v到k的最短路径长度)。 (3)以k为新考虑的中间点,修改U中各顶点的距离;若 从源点v 到顶点 u (u U )的距离(经过顶点 k)比原来距 离(不经过顶点 k )短,则修改顶点 u 的距离值,修改后 的距离值的顶点k的距离加上边上的权。 (4 )重复步骤(2 )和(3 )直到所有顶点都包含在 S 中。
第12讲 十字链表与广义表

5.5广义表的存储结构
由于广义表(a1,a2,a3,…an)中的数据元素可以具有不同的结构,(或是原子,或是广义表),因此,难以用顺序存储结构表示,通常采用链式存储结构,每个数据元素用一个结点表示。需要两种结构的结点:一种是表结点,一种是原子结点。下面介绍两种广义表的链式存储结构。
//行和列链表头指针向量基址由CreateSMatrix分配
intmu, nu, tu;//稀疏矩阵的行数、列数和非零个数
}CrossList;
(3)建立十字链表的算法
Status CreateSMatrix_OL (CrossList &M) {
if (M)free(M);
scanf(&m, &n, &t); //输入M的行数、列数和非零元个数
(续表)
课堂提问
广义表和线性表的区别和联系?
本次课内容总结
1.稀疏矩阵的十字链表表示和建立十字链表的算法;
2.广义表的定义;
3.广义表的存储结构;
思
考
题
作
业
题
设广义表L=((),()),试问head(L),tail(L),L的长度,深度各为多少?
参考
资料
《数据结构辅导与提高》,徐孝凯编著,清华大学出版社
操作结果:创建空的广义表L。
CreateGlist(&L,S);
初始条件:S是广义表的书写形式串。
操作结果:由S创建广义表L。
CreateGlist(&L);
初始条件:广义表L存在。
操作结果:销毁广义表L。
CreateGlist(&T,L);
数据结构课后习题及解析第六章

第六章习题1.试分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。
2.对题1所得各种形态的二叉树,分别写出前序、中序和后序遍历的序列。
3.已知一棵度为k的树中有n1个度为1的结点,n2个度为2的结点,……,nk个度为k的结点,则该树中有多少个叶子结点并证明之。
4.假设一棵二叉树的先序序列为EBADCFHGIKJ,中序序列为ABCDEFGHIJK,请画出该二叉树。
5.已知二叉树有50个叶子结点,则该二叉树的总结点数至少应有多少个?6.给出满足下列条件的所有二叉树:①前序和后序相同②中序和后序相同③前序和后序相同7. n个结点的K叉树,若用具有k个child域的等长链结点存储树的一个结点,则空的Child 域有多少个?8.画出与下列已知序列对应的树T:树的先根次序访问序列为GFKDAIEBCHJ;树的后根次序访问序列为DIAEKFCJHBG。
9.假设用于通讯的电文仅由8个字母组成,字母在电文中出现的频率分别为:0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10请为这8个字母设计哈夫曼编码。
10.已知二叉树采用二叉链表存放,要求返回二叉树T的后序序列中的第一个结点指针,是否可不用递归且不用栈来完成?请简述原因.11. 画出和下列树对应的二叉树:12.已知二叉树按照二叉链表方式存储,编写算法,计算二叉树中叶子结点的数目。
13.编写递归算法:对于二叉树中每一个元素值为x的结点,删去以它为根的子树,并释放相应的空间。
14.分别写函数完成:在先序线索二叉树T中,查找给定结点*p在先序序列中的后继。
在后序线索二叉树T中,查找给定结点*p在后序序列中的前驱。
15.分别写出算法,实现在中序线索二叉树中查找给定结点*p在中序序列中的前驱与后继。
16.编写算法,对一棵以孩子-兄弟链表表示的树统计其叶子的个数。
17.对以孩子-兄弟链表表示的树编写计算树的深度的算法。
18.已知二叉树按照二叉链表方式存储,利用栈的基本操作写出后序遍历非递归的算法。
C语言第12讲 结构体共用体
§6.3 结构体变量的引用
引用规则
结构体变量不能整体引用,只能引用变量成员
引用方式: 结构体变量名.成员名
例 struct 成员(分量)运算符 student 可以将一个结构体变量赋值给另一个结构体变量 例 struct student { stu1.num=10; int num; 优先级: 结构体嵌套时逐级引用 1 { int num; 例 struct student 结合性:从左向右 { char name[20]; int num; 例 struct name[20]; char sex; char student char name[20]; stu1.score=85.5; 例 structchar num; student { int sex; int char sex; age; printf(“%d,%s,%c,%d,%f,%s\n”,stu1); () if(stu1==stu2) { int age; num; stu1.birthday.month=12; char name[20]; float score; int …….. () stu1.score+=stu2.score; char score; name[20]; int age; struct float date char addr[30]; stu1.age++; float score; char addr[30]; stu1={101,“Wan Lin”,„M‟,19,87.5,“DaLian”}; () sex; { int char month; }stu1,stu2; addr[30]; char birthday int age; int }stu1,stu2; day; num name float score; }stu1,stu2; month day year int year; stu2=stu1; ( ) char addr[30]; }birthday; }stu1,stu2; }stu1,stu2;
数据结构 -第12周查找第3讲-二叉排序树.pdf
以二叉树或树作为表的组织形式,称为树表,它是一类动态查找表,不仅适合于数据查找,也适合于表插入和删除操作。
常见的树表:二叉排序树平衡二叉树B-树B+树9.3.1 二叉排序树二叉排序树(简称BST)又称二叉查找(搜索)树,其定义为:二叉排序树或者是空树,或者是满足如下性质(BST性质)的二叉树:❶若它的左子树非空,则左子树上所有节点值(指关键字值)均小于根节点值;❷若它的右子树非空,则右子树上所有节点值均大于根节点值;❸左、右子树本身又各是一棵二叉排序树。
注意:二叉排序树中没有相同关键字的节点。
二叉树结构满足BST性质:节点值约束二叉排序树503080209010854035252388例如:是二叉排序树。
66不试一试二叉排序树的中序遍历序列有什么特点?二叉排序树的节点类型如下:typedef struct node{KeyType key;//关键字项InfoType data;//其他数据域struct node*lchild,*rchild;//左右孩子指针}BSTNode;二叉排序树可看做是一个有序表,所以在二叉排序树上进行查找,和二分查找类似,也是一个逐步缩小查找范围的过程。
1、二叉排序树上的查找Nk< bt->keybtk> bt->key 每一层只和一个节点进行关键字比较!∧∧p查找到p所指节点若k<p->data,并且p->lchild=NULL,查找失败。
若k>p->data,并且p->rchild=NULL,查找失败。
查找失败的情况加上外部节点一个外部节点对应某内部节点的一个NULL指针递归查找算法SearchBST()如下(在二叉排序树bt上查找关键字为k的记录,成功时返回该节点指针,否则返回NULL):BSTNode*SearchBST(BSTNode*bt,KeyType k){if(bt==NULL||bt->key==k)//递归出口return bt;if(k<bt->key)return SearchBST(bt->lchild,k);//在左子树中递归查找elsereturn SearchBST(bt->rchild,k);//在右子树中递归查找}在二叉排序树中插入一个关键字为k的新节点,要保证插入后仍满足BST性质。
数据结构第6章习题答案
第6章树和二叉树习题解答一、下面是有关二叉树的叙述,请判断正误(每小题1分,共10分)(√)1. 若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n—1个非空指针域。
(×)2.二叉树中每个结点的两棵子树的高度差等于1。
(√)3.二叉树中每个结点的两棵子树是有序的。
(×)4.二叉树中每个结点有两棵非空子树或有两棵空子树。
(×)5.二叉树中每个结点的关键字值大于其左非空子树(若存在的话)所有结点的关键字值,且小于其右非空子树(若存在的话)所有结点的关键字值。
(应当是二叉排序树的特点)(×)6.二叉树中所有结点个数是2k-1-1,其中k是树的深度。
(应2i-1)(×)7.二叉树中所有结点,如果不存在非空左子树,则不存在非空右子树。
(×)8.对于一棵非空二叉树,它的根结点作为第一层,则它的第i层上最多能有2i—1个结点。
(应2i-1)(√)9.用二叉链表法(link-rlink)存储包含n个结点的二叉树,结点的2n个指针区域中有n+1个为空指针。
(正确。
用二叉链表存储包含n个结点的二叉树,结点共有2n个链域。
由于二叉树中,除根结点外,每一个结点有且仅有一个双亲,所以只有n-1个结点的链域存放指向非空子女结点的指针,还有n+1个空指针。
)即有后继链接的指针仅n-1个。
(√)10. 〖01年考研题〗具有12个结点的完全二叉树有5个度为2的结点。
最快方法:用叶子数=[n/2]=6,再求n2=n0-1=5二、填空(每空1分,共15分)1.由3个结点所构成的二叉树有5种形态。
2. 【计算机研2000】一棵深度为6的满二叉树有n1+n2=0+ n2= n0-1=31 个分支结点和26-1 =32个叶子。
注:满二叉树没有度为1的结点,所以分支结点数就是二度结点数。
3.一棵具有257个结点的完全二叉树,它的深度为9。
(注:用⎣ log2(n) ⎦+1= ⎣ 8.xx ⎦+1=94.【全国专升本统考题】设一棵完全二叉树有700个结点,则共有350个叶子结点。
数据结构课后习题(第6章)
【课后习题】第6章树和二叉树网络工程2010级()班学号:姓名:一、填空题(每空1分,共16分)1.从逻辑结构看,树是典型的。
2.设一棵完全二叉树具有999个结点,则此完全二叉树有个叶子结点,有个度为2的结点,有个度为1的结点。
3.由n个权值构成的哈夫曼树共有个结点。
4.在线索化二叉树中,T所指结点没有左子树的充要条件是。
5.在非空树上,_____没有直接前趋。
6.深度为k的二叉树最多有结点,最少有个结点。
7.若按层次顺序将一棵有n个结点的完全二叉树的所有结点从1到n编号,那么当i为且小于n时,结点i的右兄弟是结点,否则结点i没有右兄弟。
8.N个结点的二叉树采用二叉链表存放,共有空链域个数为。
9.一棵深度为7的满二叉树有___ ___个非终端结点。
10.将一棵树转换为二叉树表示后,该二叉树的根结点没有。
11.采用二叉树来表示树时,树的先根次序遍历结果与其对应的二叉树的遍历结果是一样的。
12.一棵Huffman树是带权路径长度最短的二叉树,权值的外结点离根较远。
二、判断题(如果正确,在对应位置打“√”,否则打“⨯”。
每题0.5分,共5分)1.对于一棵非空二叉树,它的根结点作为第一层,则它的第i层上最多能有2i-1个结点。
2.二叉树的前序遍历并不能唯一确定这棵树,但是,如果我们还知道该二叉树的根结点是那一个,则可以确定这棵二叉树。
3.一棵树中的叶子结点数一定等于与其对应的二叉树中的叶子结点数。
4.度≤2的树就是二叉树。
5.一棵Huffman树是带权路径长度最短的二叉树,权值较大的外结点离根较远。
6.采用二叉树来表示树时,树的先根次序遍历结果与其对应的二叉树的前序遍历结果是一样的。
7.不存在有偶数个结点的满二叉树。
8.满二叉树一定是完全二叉树,而完全二叉树不一定是满二叉树。
9.已知二叉树的前序遍历顺序和中序遍历顺序,可以惟一确定一棵二叉树;10.已知二叉树的前序遍历顺序和后序遍历顺序,不能惟一确定一棵二叉树;三、单项选择(请将正确答案的代号填写在下表对应题号下面。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
q->data = x; q->rchild = t->rchild; //操作2-6 q->rtag = t->rtag; q->lchild = t; q->ltag = Thread; t->rchild = q; t->rtag = Link; //操作7-8 p = q->rchild; //9.寻找q的后继p if ( p->ltag == Link )) p=p->lchild; //最左下 while ( p->ltag == Link p->lchild = q; // 10.修改p的指针 return OK
二叉链表存储表示
A
0
1
B
1
0
D
0
0
C
1 1
E
1
1
NULL
F
6.5 线索二叉树
一、问题的提出
二、线索二叉树定义
三、在线索二叉树上找前驱和后继的规律
四、如何建立中序线索二叉树?
五、线索二叉树的遍历算法
六、在线索二叉树中插入结点
二、线索二叉树
术语:
线索:指向该线性序列中的“前驱” 和 “后继” 的指针。
线索链表:包含 “线索” 的存储结构。 ltag lchild data rchild rtag
对线索链表中结点的约定:
ltag lchild data rchild rtag
若该结点的右子树不空, 则rchild域的指针指向其右子树, 且右标志域的值为 “指针 Link”; 即:rtag = 0; 否则,rchild域的指针指向其“后继” 且右标志的值为“线索 Thread”。 即:rtag = 1 ;
如果是非叶子结点,则: 找后继: 如果有左孩子,则左孩子是其后继; 如果无左孩子,则右孩子是其后继; 如果是叶子结点,则右线索所指结点为后继; 找前驱: 如果无左孩子,则左线索所指结点为前驱; 否则需要遍历;
0 1
A
0 1
ABCDEF
D
0 1 0
B
1
0
C
1
E
1
1 NULL
先序线索二叉树
F
2.在中序线索二叉树找前驱和后继
先序线索二叉树找后继方便, 找前驱可能需要遍历。
中序线索二叉树找前驱和后继都方便
后序线索二叉树找前驱方便, 找后继可能需要遍历。
6.5 线索二叉树
一、问题的提出
二、线索二叉树定义
三、在线索二叉树上找前驱和后继的规律
四、如何建立中序线索二叉树?
五、线索二叉树的遍历算法
六、在线索二叉树中插入结点
四、如何建立中序线索二叉树?
在中序遍历过程中修改结点的
左、右指针域,以保存当前访问结 程中,附设指针pre, 并始终保持指 针pre指向当前访问的结点前驱。
点的“前驱”和“后继”信息。遍历过
pre
p
0 0
pre
pre
pre
pre
pre
p
pre pre
递归建立当前结点p的左孩子的中序线索链 表 1.左子树线索化(得到前驱结点pre);
三、树的二叉链表(孩子-兄弟) 存储表示法
一、双亲表示法: A B C
E F G
结点
data parent
D
0 1 2 3 4 5 6
A B C D E F G
-1 0 0 0 2 2 5
树
r=0 n=7
C语言的类型描述:
#define MAX_TREE_SIZE 100 树结构: typedef struct { PTNode nodes [MAX_TREE_SIZE]; int r, n; // 根结点的位置和结点个数 } PTree; data parent 结点结构: typedef struct PTNode { Elem data; int parent; // 双亲位置域 } PTNode;
先序线索二叉树
先序遍历: A B C D E F
0
A
0
1
B
1
0
1
D
0
0
C
1
1
E
1
1
F
NULL
中序线索二叉树
中序遍历: B C A D F E
NULL
0
A
0
NULL
1
B
1
0
1
D
0
C
1
0
E
1
1
1
F
后序线索二叉树
后序遍历: C B F E D A
0
A
0
1
B
1
0
1
D
0
0
C
1
1
E
1
1
NULL
F
6.5 线索二叉树
6.5 线索二叉树
一、问题的提出
二、线索二叉树定义
三、在线索二叉树上找前驱和后继的规律
四、如何建立中序线索二叉树?
五、中序线索二叉树的遍历算法
六、在线索二叉树中插入结点
五、中序线索二叉树的遍历算法
如果已经通过遍历(前序,中序和后序)
得到线索二叉树。 那么,对线索化的二叉树进行遍历就比
对一般二叉树进行遍历更加有效和方便。
孩子 链表 头 结点:
typedef struct CTNode { 孩子 int child; 链表 struct CTNode *nextchild; 结点: } *ChildPtr;
三、树的二叉链表 (孩子-兄弟) 存储表示法
firstchild data nextsibling
树
A D
B
2.当前结点p线索化
建前驱线索(当前结点左空,指向pre);
建后继线索(pre右空,指向当前结点);
重新修改前驱结点p指针为 pre; 3.右子树线索化(得到前驱结点pre)
void InThreading(BiThrTree p, BiThrTree pre) { if (p) { // 对以p为根的非空二叉树进行中序线索化 InThreading(p->lchild, pre); // 左子树线索化 if (!p->lchild) // 空,建前驱线索 { p->LTag = Thread; p->lchild = pre; } if (!pre->rchild) // 空,建后继线索 { pre->RTag = Thread; pre->rchild = p; } pre = p; // 保持 pre 指向 p 的前驱 InThreading(p->rchild , pre); // 右子树线索化 } // if } // InThreading
线索链表的类型描述:
typedef enum PointerThr{ Link, Thread } ; // Link==0:指针,Thread==1:线索
typedef struct BiThrNod { TElemType data; struct BiThrNode *lchild, *rchild; // 左右指针 PointerThr LTag, RTag; // 左右标志 } BiThrNode, *BiThrTree;
如果无右孩子,则右线索所指结点为后继; 找后继:
否则需要遍历; 找前驱: 如果有右孩子,则右孩子是其前驱; 如果无右孩子,但有左孩子,则左孩子为前驱; 如果无左孩子,则左线索所指结点为前驱;
后序线索二叉树
1
0
A
0
1
CBFEDA D
0 1 0
B
1
0
C
1
E
1
1
NULL
F
4. 线索二叉树上找前驱和后继的一般规律
void InOrderTraverse_Thr(BiThrTree T, void (*Visit)(TElemType e)) { p = T->lchild; // T指向头结点,p指向根结点 ① while (p != T) { // 空树或遍历结束时,p==T ② while (p->LTag==Link) p = p->lchild; // 最左下结点 Visit(p->data) ; // 访问最左下结点 ③ while (p->RTag==Thread && p->rchild!=T) {p = p->rchild; Visit(p->data); } // 访问后继结点 p = p->rchild; // p进至其右子树根或头结点 } } // InOrderTraverse_Thr
} // Insert_Thr
6.1 树的类型定义 6.2 二叉树的类型定义 6.3 二叉树的存储结构 6.4 二叉树的遍历
6.5 线索二叉树
6.6 树和森林的表示方法
6.7 树和森林的遍历
6.8 哈夫曼树与哈夫曼编码
6.6 树和森林 的表示方法
树的三种存储结构 树与二叉树的转换
树的三种存储结构 一、双亲表示法 二、孩子链表表示法
6.5 线索二叉树
一、问题的提出
二、线索二叉树定义
三、在线索二叉树上找前驱和后继的规律
四、如何建立中序线索二叉树?
五、线索二叉树的遍历算法
六、在线索二叉树中插入结点
如何找二叉树上结点的前驱和后继?
遍历二叉树的结果是, 求得结点的一个线性序列。 例如: A 先序序列: ABCDEFGHK B E 中序序列: C F BDCAHGKFE G D 后序序列: H K
找后继:若无右孩子,则右线索所指结点为后继; 否则,右孩子的“最左下”孩子为后继; 若无左孩子,则左线索所指结点为前驱; 找前驱: 否则,左孩子的“最右下”孩子为前驱;