数据结构中常见的基本结构

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

return mid; // 找到待查元素
else if ( LT (key , ST.elem[mid].key) ) // <
high = mid - 1; // 继续在前半区间进行查找
else low = mid + 1; // 继续在后半区间进行查找
}
return 0;
// 顺序表中不存在待查元素
1.基本概念 9.1 基础知识 是一种数据结构
1)查找表 ——由同一类型的数据元素(或记录)构成的集合
2)查找
——查询(Searching)特定元素是否在表中
3)查找成功 ——若表中存在特定元素,称查找成功,应输出该记录
4)查找不成功——否则,称查找不成功(也应输出失败标志或失败位置)
5)静态查找 ——只查找,不改变集合内的数据元素。
4.二叉排序树的插入算法
• 根据动态查找表的定义,“插入” 操作在查找不成功时才进行;
• 若二叉排序树为空树,则新插入的 结点为新的根结点;否则,新插入 的结点必为一个新的叶子结点,其 插入位置由查找过程得到。
这样算法需要改进!
二叉排序树查找算法的改进:
Status SearchBST (BiTree T, KeyType key,
int Search_Bin ( SSTable ST, KeyType key ) {
low = 1; high = ST.length; // 置区间初值
while (low <= high) {
mid = (low + high) / 2;
if (EQ (key , ST.elem[mid].key) ) // ==
BiTree f, BiTree &p ) {
// 在根指针 T 所指二叉排序树中递归地查找其 // 关键字等于 key 的数据元素,若查找成功, // 则返回指针 p 指向该数据元素的结点,并返回 // 函数值为 TRUE; 否则表明查找不成功,返回 // 指针 p 指向查找路径上访问的最后一个结点, // 并返回函数值为FALSE, 指针 f 指向当前访问 // 的结点的双亲,其初始调用值为NULL
// 数据元素时,插入元素值为 e 的结点,并返 // 回 TRUE; 否则,不进行插入并返回FALSE
if (!SearchBST ( T, e.key, NULL, p ))
{ …… }
else return FALSE; } // Insert BST
s = (BiTree) malloc (sizeof (BiTNode));
(1)若它的左子树不空,则左子树上所有结点的值 均小于根结点的值;
(2)若它的右子树不空,则右子树上所有结点的值 均大于根结点的值; (3)它的左、右子树也都分别是二叉排序树。
例如:
50
30
20
40
80 90
10 25 35
66 85
23
88
不 是二叉排序树。
思二考叉:排二序叉树排的序中树序的遍中历序遍列历有序一列个有什序么序特列点(?升序)
现场试验
请查阅号18号同学的成绩
请查阅 “周丽”同学的成 绩
结论:
1.按照学号查找相对容易、省时 2.按照姓名查找相对费时
原因:一个有序、一个无序
同样:日常生活中的查字典也是如此!
数据存放的方式决定数据查找的方法
第9章 查找表
9.1 基础知识简介 9.2 静态查找表 9.3 动态查找表 9.4 哈希表
{pd=i; // 判断标记记录具体位置 break; }
return pd;
} // Search_Seq
2)折半查找
上述顺序查找算法简单,但平均查找长 度较大,特别不适用于表长较大的查找表。
为此引入折半查找算法 先给数据排序(例如按升序排好),形
成有序表,然后再将key与中间元素相比,若 key小,则缩小至左半部内查找;若key大, 则缩小至右半部内查找;再取其中值比较, 每次缩小1/2的范围,直到查找成功或失败为 止。
9.2 静态查找表
1.抽象数据类型的定义
ADT StaticSearchTable { 数据对象D:D是具有相同特性的数
据元素的集合。每个数 据元素含有类型相同的 关键字,可唯一标识数 据元素。
数据关系R:数据元素同属一个集合。
基本操作 P:
Create(&ST, n); Destroy(&ST); Search(ST, key); Traverse(ST, Visit()); } ADT StaticSearchTable
• 2)检索某个“特定的”数据元素的 各种属性;
• 3)在查找表中插入一个数据元素; • 4)从查找表中删去某个数据元素。
3.查找表的分类
静态查找表
仅作查询和检索操作的查找表。
动态查找表
有时在查询之后,还需要将“查询”结 果为“不在查找表中”的数据元素插入 到查找表中;或者从查找表中删除其 “查询”结果为“在查找表中”的数据
} SSTable;
0 1 2 3 4 5 6 7 8 9 10 11
elem
3.静态查找表的查找算法
1)顺序查找 即用逐一比较的办法顺序查找关键字, 这显然是最直接的办法。
技巧: 把待查关键字key存入表头或表尾
(俗称“哨兵”),这样可以加快执 行速度。
Flash动画演示
示例:已知静态查找表ST如下:
2.二叉排序树的存储结构: 二叉链表
typedef struct BiTNode { // 结点结构 TElemType data; struct BiTNode *lchild, *rchild; // 左右孩子指针
} BiTNode, *BiTree;
3.二叉排序树的查找算法
若二叉排序树为空,则查找不成功; 否则, • 1)若给定值等于根结点的关键字,
2.静态查找表的顺序存储结构
typedef struct { ElemType *elem;
typedef struct {
keyType key; // 关键字域
……
// 其它属性域
} ElemType ;
// 数据元素存储空间基址,建表时
// 按实际长度分配,0号单元留空
int length; // 表的长度
例如: key=64 的查找过程如下:
ST.elem
ST.length
05 13 19 21 37 56 64 75 80 88 92
0 1 2 3 4 5 6 7 8 9 10 11
low
low high
high
mid mid mid
low 指示查找区间的下界 high 指示查找区间的上界 mid = (low+high)/2
// 为新结点分配空间
s->data = e; s->lchild = s->rchild = NULL;
if ( !p ) T = s; // 插入 s 为新的根结点
else if ( LT(e.key, p->data.key) )
p->lchild = s; // 插入 *s 为 *p 的左孩子
数据结构中常见的基本结构
线性结构 树形结构 图状结构 集合结构
线性表 栈 队列 串

树和二叉树
第9章 查找表
什么是查找? 如何进行查找? 查找与现实生活的密切关系如何?
2006.12.03是什么日子?
评估专家进校
随机查阅有关的班级课程档案!
对班级课程档案进行的最为常见的“操作”是什么?
对同学而言: 查看、核实
// 在左子树中继续查找
else SearchBST (T->rchild, key, T, p );
// 在右子树中继续查找
设 key = 4282
Tf
f Tf Tf f
30
f Tp
20
T f
40 T
10 Tp f 25 35
T 23
二叉排序树的插入算法:
Status Insert BST(BiTree &T, ElemType e ) { // 当二叉排序树中不存在关键字等于 e.key 的
key=60
ST.Length
int Search_Seq(SSTable ST,
KeyType key) {
// 在顺序表ST中顺序查找其关键字等于 // key的数据元素。若找到,则函数值为 // 该元素在表中的位置,否则为0。
ST.elem[0].key = key; // “哨兵”
for (i=ST.length; ST.elem[i].key!=key; --i);
// 关键字等于 key 的数据元素 if ((!T) || T->data.key==key) return(T); else if (T->data.key>key)
return(SearchBST (T->lchild, key) ); else return(SearchBST (T->rchild, key) ); } // SearchBST
else p->rchild = s; // 插入 *s 为 *p 的右孩子
return TRUE; // 插入成功 二叉树生成Flash
5.二叉排序树的删除算法
和插入相反,删除在查找成功之后进行,并 且要求在删除二叉排序树上某个结点之后,仍 然保持二叉排序树的特性。
可分三种情况讨论:
• (1)被删除的结点是叶子; • (2)被删除的结点只有左子树或者只有
从根结点出发,沿着左分支或右分支 逐层向下直至关键字等于给定值的结点;
或者
——查找成功
从根结点出发,沿着左分支或右分支 逐层向下直至指针指向空树为止。
——查找不成功
二叉排序树的查找算法:
Status SearchBST (BiTree T, KeyType key) { // 在根指针 T 所指二叉排序树中递归地查找其
ST.elem
i
i
64 21 37 88 19 92 05 64 56 80 75 13
0 1 2 3 4 5 6 7 8 9 10 11
key=64
ST.Length
i
i
ST.elem
60 21 37 88 19 92 05 64 56 80 75 13
0 1 2 3 4 5 6 7 8 9 10 11
则查找成功;
• 2)若给定值小于根结点的关键字, 则继续在左子树上进行查找;
• 3)若给定值大于根结点的关键字, 则继续在右子树上进行查找。
例如: 二叉排序树
50 30
20
40
80 90
35
85
32
88
查找关键字
== 50 , 35 , 90 , 95
从上述查找过程可见: 在查找过程中,生成了一条查找路径:
// 从后往前找
return i;
// 找不到时,i为0
} // Search_Seq
实践:在上题的基础上写出从前往后找的算法
int Search_Seq(SSTable ST,
KeyType key) {
pd=0;
// 判断标记
for (i=1;i<=ST.length; i++)
if (ST.elem[i].key==key)
} // Search_Bin
9.2 动态查找表
动态查找表的特点: 表结构本身是在查找过程中动 态生成的,即对于给定值Key,若表中存在其关键字等 于Key的记录,则查找成功返回,否则插入关键字等于 Key的记录。
一、二叉排序树 二、平衡二叉树
一、二叉排序树
1.定义:
二叉排序树或者是一棵空树;或者是具有如下 特性的二叉树:
右子树; • (3)被删除的结点既有左子树,也有右
子树。
(1)被删除的结点是叶子结点
例如:
被删关键字 = 2808
50
30
80
20
40
90
35
85
32
Hale Waihona Puke Baidu
88
其双亲结点中相应指针域的值改为“空”
(2)被删除的结点只有左子树
或者只有右子树
被删关键字 = 480
50
30
80
20
40
90
35
85
32
88
其双亲结点的相应指针域的值改为 “指向被删除结点的左子树或右子树”。
…………
} // SearchBST
if (!T) { p = f; return FALSE; } // 查找不成功
else if ( EQ(key, T->data.key) ) { p = T; return TRUE; } // 查找成功
else if ( LT(key, T->data.key) ) SearchBST (T->lchild, key, T, p );
6)动态查找 ——既查找,又改变(增减)集合内的数据元素
7)关键字 ——记录中某个数据项的值,可用来识别一个记录
( 预先确定的记录的某种标志 )
8)主关键字 ——可以唯一标识一个记录的关键字
例如“学号”
9)次关键字 ——识别若干记录的关键字 例如“女”
2.对查找表经常进行的操作
• 1)查询某个“特定的”数据元素是 否在查找表中;
相关文档
最新文档