数据结构-考研课程总结.ppt

数据结构-考研课程总结要点

数据结构 4链栈上基本运算的实现: 1) 进栈 PUSHLSTACK(top,x) 解决“假上溢”的方法有两种: 第八章 排序 例1:(p41 2.9)假设在长度大于1的单循环链表中,既无头结点也无头指针,S为指向链表中某个结点的指针,试编写算法删除结点*S的直接前趋结点。 例2:(p41 2.11) 设有一个双循环链表,每个结点中除有prior、data和next三个域外,还有一个访问频度域freq,在链表被启用之前,其值均初始化为零。每当在链表进行一次LOCATE(L,x)运算时,令元素值为x的结点中freq域的值增1,并使此链表中结点保持按访问频度递减的顺序排列,以便使频繁访问的结点总是靠近表头。试编写实现符合上述要求的LOCATE运算的算法。 typedef struct dnode { datatype data; int freq; struct dnode *prior, *next; }dlklist; 1)分块查找要求: 按索引方式存储线性表: i)线性表中的结点被均分为b块,前b-1块中结点的个数 为S=? n/b ?,第b块的结点数小于等于S; ii)每一块中结点的关键字不要求有序。 iii)但前一块中结点的最大关键字应小于后一块中结点的 最小关键字;即要求表是“分块有序”; iv)抽取每一块中结点的最大关键字及该块的起始位置构成一个索引表ID[b],即ID[i](0=ib)存放着第i块的最大关键字及该块在表R中的起始位置;由于R表是分块有序的, 很显然该索引表是递增有序的。 下标 键值 0 1 2 3 4 5 6 7 8 9 14 7 3 29 55 31 67 79 93 80 b=3 addr key 0 4 8 29 79 93 索引表 2)分块查找的基本思想: a)先采用二分或顺序查找方法查找索引表,确定待查结点所处的块. b)在确定的块中进行顺序查找。 说明:即使对索引表和块均采用顺序查找方法进行查找,分块查找方法仍较简单顺序查找方法快。 举例: 分块查找的平均查找长度由两部分构成:查找块的平均查找长度和块内的平均查找长度。 若采用二分法查找块,则 ASLblk=ASLbn+ASLsq ? log2(b+1)-1+(s+1)/2 ? log2(n/s+1)+s/2 查找过程: 索引表的二分查找 块内顺序查找 4)算法分析 若顺序查找确定块,则 ASL’blk=(b+1)/2+(s+1)/2=(s2+2s+n)/2s (当s=n 1/2时,取最小值n 1/2+1) 9.3 树 表 的 查 找 当表采用二叉树实现存储时,这样的表称为树表。 9.3.1 二 叉 排 序 树 1.二叉排序树(或称为二叉查找树)的定义: 二叉排序树或者是一棵空树,或者是具有如下性质的二叉树: (1)若它的左子树非空,则左子树上所有结点的值均小于根结点的值。 (2)若它的右子树非空,则右子树上所有结点的值均大于根结点的值。 (3) 左、右子树本身又各是一棵二叉排序树。 由二叉排序树的定义可知,中序遍历二叉排序树将得到一个升序的遍历序列。 23 18 43 8 21 32 二叉排序树 中序遍历的键值序列为:8 18 21 23 32 43 2.二叉排序树存储结构: typedef struct node { keytype key ; datatype other ; struct node *lchild,*rchild ; } bstnode 1).二叉排序树的结点的插入 3.二叉排序树上的操作 插入结点运算实现的基本思想: 1)若二叉排序树空,则待插结点*s作为根结点插入到空树中; 2)如二叉排序树非空,将待插结点的关键字s?key与树根的关键字t ?key比较:若s ?key=t ?key则说明树中已有此结点,无须插入。若s?keyt ?key,则将待插结点*s插入到根的左子树中,否则将*s插入到根的右子树中。 3)将结点插入到子树中与插入到树中的过程一样. 生成二叉排序树的思想:可通过多次调用插入过程来生成 如:插入序列为2,1,7,8,5 2).二叉排序树的生成 3).二叉排序树的删除 二叉排序树的删除过程: (a)查找(即定位)将被删除的结点。 (b)在删除了相应的结点后,对二叉树要进行调整,使其仍为二叉排序树。     12  次序2:

文档评论(0)

1亿VIP精品文档

相关文档