动态查找表
动态查找表除了支持查找操作,还支持插入、删除等改变表中数据的操作。
动态查找表的表结构是在查找过程中动态生成的,即对于给定的key值,若表中存在其关键字等于key的记录,则查找成功;否则插入关键字等于key的记录。
为了方便插入和删除操作,通常采用链表、树等存储结构来表示动态查找表。
1.1 二叉排序树(binary sort tree,BST)是一棵空树,或满足如下性质的二叉树:
(1) 若它的左子树非空,则左子树上所有结点的值均小于根结点的值;
(2) 若它的右子树非空,则右子树上所有结点的值均大于根结点的值;
(3) 左右子树本身也分别是一棵二叉树。
由二叉树的性质可得知:
(1) 二叉排序树中任一结点x,其左子树中任一结点y的关键字必小于x的关键字,右子树亦然;
(2) 二叉排序树中,各结点关键字是唯一的;
(3) 按中序遍历该树得到的中序序列是一个递增有序序列。
二叉排序树的运算包括插入、删除、生成和查找等,因此常用二叉链表作为二叉排序树的存储结构,定义如下:
typedef int keytype;
typedef struct node{
keytype key;
struct node *lchild,*rchild;//左右子树指针
}BSTNode;
typedef BSTNode *BSTree;//定义二叉排序树类型的指针
a) 二叉排序树的插入
在二叉排序树中插入新结点,要保证插入后仍满足BST的性质,过程如下:
(1) 若二叉排序树T为空,则为待插入的关键字key申请一个新结点,并令其为根;
(2) 若二叉排序树T不为空,则将key和根的关键字比较;
(3) 若两者相等,则说明树中已有此关键字key,无需插入;
(4) 若key<T->key,则将key插入到根的左子树;
(5) 若key>T->key,则将key插入到根的右子树。
算法描述如下:
void insertBST(BSTree *bst,keytype key){
//若二叉排序树*bst中没有关键字为key,则插入
BSTNode *p = *bst;
while(p){
if(p->key == key) return;//已存在,不需要插入
p = (key < p->key) ? p->lchild:p->rchild;
//在左右子树中查找
}
BSTNode *f = (BSTNode *)malloc(sizeof(BSTNode));//新分配一个结点空间
//生成新结点f
f->key = key;
f->lchild = f->rchild = NULL;
if(*bst == NULL) *bst = f;//原树为空
else
if(key<p->key) p->lchild = f;
else p->rchild = f;
}//insertBST
b) 二叉排序树的生成
BSTree createBST(){
//输入一个结点序列,建立一棵二叉排序树,将根结点指针返回
BSTree T = NULL;
keytype key;
scanf("%d",&key);
while(key != '0'){
insertBST(&T,key);
scanf("%d",&key);//读入下一个关键字
}
return T;
}
c) 二叉排序树的删除
在二叉排序树中删除一个结点时,必须将因删除而断开的二叉链表重新连接起来,同时保持二叉排序树的性质不变。
假设二叉排序树上被删除结点为*p,其父节点为*parent,可设p是parent的左指针。
可分下面3中情况讨论:
(1) 若*p结点为叶子结点,只需要将*parent中指向*p的指针域置为NULL即可;
(2) 若*p结点只有左子树或右子树,只需要将*p的左或右子树直接连接到*parent即可。
(3) 若*p结点的左右子树均不空,中序遍历该树,得到*p的直接后继是*s,*s结点是*p结点的右子树的最左下的结点,且*s结点无左子树,降被删除的结点*p用*s代替,同时将*s结点的右子树作为*s结点的父结点的左子树。
程序描述如下:
void delBSTNode(BSTree *bst,keytype key){
if(!bst) return;//如果二叉排序树为空,则直接返回
BSTNode *parent = NULL,*p = *bst,*child,*s;
while(p){//从根开始查找关键字为key的待删结点
if(p->key == key) break;//找到,跳出循环
parent = p;//父结点为*p的双亲
p = (key < p->key) ? p->lchild : p->rchild;
}
if(!p) return; //找不到待删记录,返回
if(!parent){//只有一个根节点,删除之后就什么都没了
bst = NULL;
}
//处理情况1,*p为叶子结点,修改*p的父结点*parent指向*p的指针域为空即可
if(!p->lchild && !p->rchild){
child = parent->lchild ? parent - >lchild : parent ->rchild;
child = NULL;
}
//处理情况2,*p只有左子树或右子树,只需要将左子树或右子树与parent直接关联即可
if(!p->lchild || !p->rchild){
child = parent->lchild ? parent - >lchild : parent ->rchild;
child = p->lchild ? p->lchild : p->rchild;
}
//处理情况3,*p有左右子树,需要找到*p右子树的最左下结点*s,p被s代替,且s的右子树为s父结点的左子树
if(p->lchild && p-> rchild){
parent = p;
s = p->rchild;
while(!s->lchild){
parent = s;
s = s->lchild;
}
p->key = s->key;//替换数据,这样就不用替换其他关系了
parent->lchild = s->rchild;//s的右子树为s父结点的左子树
p = s;
}
free(p);
}
d) 二叉排序树的查找
过程如下:
(1) 从根结点开始,沿某一个分支逐层向下比较判断,相等,则成功返回。
(2) 若查找值小于根节点的值,从根节点的左子树查找,否则,从右子树查找。
(3) 若查找到最后,左子树或右子树为空,则查询失败。
算法描述如下:
BSTNode *searchBST(BSTree *bst,keytype key){
if(bst == NULL || bst->key == key){//递归查询终止条件
return bst;//bst为空,则查找失败,成功则返回结点位置
}
return key < bst->key?searchBST(T->lchild,key) : searchBST(T->rchild,key)
}
e) 二叉排序树的查找分析
二叉排序树查找时,与关键字比较的次数不超过树的深度。
查找时的平均查找长度与二叉排序树的形态有关。
最坏的情况为n个关键字已基本有序,得到一个深度为n的单枝树,此时平均查找长度为(n+1)/2。
最好的情况,二叉排序树左右形态比较平衡,其平均查找长度为[log(2)n]+1
分享到:
相关推荐
二叉排序树,又称二叉查找树或二叉搜索树,是一种特殊的二叉树数据结构,它具有以下特性:对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。这种性质使得...
在数据结构的学习中,二叉排序树(Binary Search Tree,BST)是一种常见的树形数据结构,它具有查找、插入和删除等操作的高效性。在这个课程设计中,我们将重点探讨如何利用二叉链表作为存储结构来实现二叉排序树,...
二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子节点的指针和一个指向右子节点的指针。在二叉排序树中,对于...
二叉排序树插入算法 二叉排序树插入是指在二叉排序树中插入新的数据元素的过程。二叉排序树是一种特殊的二叉树,它的每个结点的关键字都大于左子树的关键字,小于右子树的关键字。因此,在插入新的数据元素时,需要...
【二叉排序树与文件操作】 功能要求: (1)从键盘输入一组学生记录建立二叉排序树; (2)二叉排序树存盘; (3)由文件恢复内存的二叉排序树; (4)中序遍历二叉排序树; (5)求二叉排序树深度; (6)求二叉...
二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉排序树中...
二叉排序树,又称二叉查找树或二叉搜索树,是一种特殊的数据结构,它具有以下特性:对于树中的任意节点,其左子树中的所有节点的值都小于该节点的值,而右子树中所有节点的值都大于该节点的值。这种特性使得在二叉...
【二叉排序树】,全称为Binary Sort Tree,是一种特殊的二叉树,其每个节点的值都大于其左子树中的所有节点值,且小于其右子树中的所有节点值。这种特性使得二叉排序树在查找、插入和删除操作上具有较高的效率。 在...
二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或二叉搜索树,是一种自平衡的二叉树数据结构,它在处理搜索、插入和删除操作时具有较高的效率。二叉排序树的主要特性是:对于任意节点,其左子树中的所有...
二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或有序二叉树,是一种特殊类型的二叉树,其每个节点的左子树只包含比其小的元素,右子树包含比其大的元素,且整个树保持自平衡。在本实验报告中,我们将深入...
二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树或有序二叉树,是一种自平衡的二叉树数据结构。在二叉排序树中,对于任意一个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都...
根据给定的信息,我们可以分析出该段代码主要实现了二叉排序树的基本操作,包括创建、插入元素、查找元素以及中序遍历等。下面将详细解释这些知识点。 ### 数据结构:二叉排序树 二叉排序树(Binary Search Tree, ...
二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树,是一种特殊的二叉树数据结构,它具有以下特性: 1. 每个节点包含一个键(key)、一个关联的值、一个指向左子节点的引用和一个指向右子节点的引用。 2. ...
二叉排序树C语言的简单实现,包含如下操作: 1.创建二叉排序树; 2.销毁二叉排序树; 3.清空二叉排序树; 4.插入指点结点至二叉排序树; 5.删除二叉排序树指点结点; 5.获取二叉排序树指定结点; 6.获取二叉排序树根...
二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键值,且满足以下性质:对于任意节点,其左子树中所有节点的键值均小于该节点的键值;其右子树中所有...
二叉排序树(Binary Search Tree,BST),又称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构。它在计算机科学中扮演着重要角色,特别是在数据检索、排序和组织方面。VC++是Microsoft开发的一款集成开发...