二叉排序树(BSTree)关于查找算法结合

2024-01-19 18:58

本文主要是介绍二叉排序树(BSTree)关于查找算法结合,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/*基于树的顺序查找法*/
/*二叉排序树的存储结构*/
typedef struct node {KeyType key;                      /*关键字的值*/struct node *lchild, *rchild;     /*左右指针*/
} NSTNode, *BSTree;
/*二叉排序树插入递归算法*/
void InsertBST(BSTree *bst, KeyType key) {BiTree s;if(*bst == NULL) {s = (BSTree)malloc(sizeof(BSTNode));s->key = key;s->lchild = NULL; s->rchild = NULL;*bst = s;}else if(key < (*bst)->key) {InsertBST(&((*bst)->lchild), key);}else if(key > (*bst)->rchild, key) {InsertBST(&((*bst)->rchild), key);}
/*创建二叉排序树*/
void CreateBST(BSTree *bst) {KeyType key;*bst = NULL;scanf("%d", &key);while(key != ENDKEY) {      /*ENDKEY为自定义常量*/InsertBST(bst, key);scanf("%d", &key);}
}
/*二叉排序树查找的递归算法*/
BSTree SearchBST(BSTree bst, KeyType key) {if(!bst) return NULL;else if(bst->key = key) return bst;else if(bst->key > key) return SearchBST(bst->lchild, key);else return SearchBST(bst->rchild,key);
}
/*二叉排序树查找的非递归算法*/
BSTree SearchBST(BSTree bst, KeyType key) {BSTree q;q = bst;while(q) {if(q->key == key) {return q;}if(q->key > key) {q = q->lchild;}else q = q->rchild;}return NULL;
}
/*二叉排序树的删除*/
BSTree* DelBST(BSTree t, KeyType k) {BSTNode *p,*f,*s,*q;p = t; f =NULL;while(p) {if(p->key == key) break;f = p;     /*f指向p结点的双亲结点*/if(p->key > key) p = p->lchild;else p = p->rchild;}    /*以上步骤找到p在二叉排序树中的位置*/if(p == NULL) return t;    /*若找不到,返回原来的二叉排序树*/if(p->lchild == NULL) {    /*p无左子树*/if(f = NULL) {         /*如果根结点就是要删除的结点*/t = p->rchild;     /*t右子树置为根*/}else if(f->lchild == p) {    /*如果p是f的左孩子*/f->lchild = p->rchild;   /*将p的右子树连在f的左链上*/}else {     /*如果p是f的右孩子*/f->rchild = p->rchild;  /*将p的右子树连在f的右链上*/}free(p);}else {     /*p有左子树*/q = p; s = p->lchild;while(s->rchild) {q = s; s = s->rchild;     /*在p的左子树中找最右下结点*/}if(q == p) {                  /*如果p的左子树没有右子树*/q->lchild = s->lchild;    /*将s的左子树连到q(此时即为p)上*/}else {                        /*如果p的左子树有右子树 此时s为最右下结点*/q->rchild = s->lchild;}p->key = s->key;             /*将s的值赋给p*/free(s);}return t;
}


知乎:Solo | 微博@从流域到海域

这篇关于二叉排序树(BSTree)关于查找算法结合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/623364

相关文章

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Python结合requests和Cheerio处理网页内容的操作步骤

《Python结合requests和Cheerio处理网页内容的操作步骤》Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一,requests库是Python中用于发送HT... 目录一、前言二、环境搭建三、requests库的基本使用四、Cheerio库的基本使用五、结合req

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Python中lambda排序的六种方法

《Python中lambda排序的六种方法》本文主要介绍了Python中使用lambda函数进行排序的六种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1.对单个变量进行排序2. 对多个变量进行排序3. 降序排列4. 单独降序1.对单个变量进行排序