`
housen1987
  • 浏览: 344930 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论
阅读更多

动态查找表

    动态查找表除了支持查找操作,还支持插入、删除等改变表中数据的操作。

    动态查找表的表结构是在查找过程中动态生成的,即对于给定的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

分享到:
评论

相关推荐

    二叉排序树_17281183_刘梦婷_leavingtbk_二叉排序树_

    二叉排序树,又称二叉查找树或二叉搜索树,是一种特殊的二叉树数据结构,它具有以下特性:对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。这种性质使得...

    数据结构课程设计 二叉排序树与平衡二叉排序树

    在数据结构的学习中,二叉排序树(Binary Search Tree,BST)是一种常见的树形数据结构,它具有查找、插入和删除等操作的高效性。在这个课程设计中,我们将重点探讨如何利用二叉链表作为存储结构来实现二叉排序树,...

    Java实现二叉排序树

    二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子节点的指针和一个指向右子节点的指针。在二叉排序树中,对于...

    二叉排序树插入

    二叉排序树插入算法 二叉排序树插入是指在二叉排序树中插入新的数据元素的过程。二叉排序树是一种特殊的二叉树,它的每个结点的关键字都大于左子树的关键字,小于右子树的关键字。因此,在插入新的数据元素时,需要...

    二叉排序树与文件操作

    【二叉排序树与文件操作】 功能要求: (1)从键盘输入一组学生记录建立二叉排序树; (2)二叉排序树存盘; (3)由文件恢复内存的二叉排序树; (4)中序遍历二叉排序树; (5)求二叉排序树深度; (6)求二叉...

    二叉排序树C++实现

    二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉排序树中...

    数据结构之二叉排序树的生成

    二叉排序树,又称二叉查找树或二叉搜索树,是一种特殊的数据结构,它具有以下特性:对于树中的任意节点,其左子树中的所有节点的值都小于该节点的值,而右子树中所有节点的值都大于该节点的值。这种特性使得在二叉...

    二叉排序树 c 版本

    【二叉排序树】,全称为Binary Sort Tree,是一种特殊的二叉树,其每个节点的值都大于其左子树中的所有节点值,且小于其右子树中的所有节点值。这种特性使得二叉排序树在查找、插入和删除操作上具有较高的效率。 在...

    实现二叉排序树的各种算法

    二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或二叉搜索树,是一种自平衡的二叉树数据结构,它在处理搜索、插入和删除操作时具有较高的效率。二叉排序树的主要特性是:对于任意节点,其左子树中的所有...

    数据结构二叉排序树及其操作实验报告

    二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或有序二叉树,是一种特殊类型的二叉树,其每个节点的左子树只包含比其小的元素,右子树包含比其大的元素,且整个树保持自平衡。在本实验报告中,我们将深入...

    二叉排序树C++

    二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树或有序二叉树,是一种自平衡的二叉树数据结构。在二叉排序树中,对于任意一个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都...

    数据结构二叉排序树的源代码

    根据给定的信息,我们可以分析出该段代码主要实现了二叉排序树的基本操作,包括创建、插入元素、查找元素以及中序遍历等。下面将详细解释这些知识点。 ### 数据结构:二叉排序树 二叉排序树(Binary Search Tree, ...

    二叉排序树增删改查

    二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树,是一种特殊的二叉树数据结构,它具有以下特性: 1. 每个节点包含一个键(key)、一个关联的值、一个指向左子节点的引用和一个指向右子节点的引用。 2. ...

    二叉排序树C实现代码

    二叉排序树C语言的简单实现,包含如下操作: 1.创建二叉排序树; 2.销毁二叉排序树; 3.清空二叉排序树; 4.插入指点结点至二叉排序树; 5.删除二叉排序树指点结点; 5.获取二叉排序树指定结点; 6.获取二叉排序树根...

    二叉排序树实现教师成果管理系统源码

    二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键值,且满足以下性质:对于任意节点,其左子树中所有节点的键值均小于该节点的键值;其右子树中所有...

    vc++二叉排序树的程序

    二叉排序树(Binary Search Tree,BST),又称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构。它在计算机科学中扮演着重要角色,特别是在数据检索、排序和组织方面。VC++是Microsoft开发的一款集成开发...

Global site tag (gtag.js) - Google Analytics