二叉排序树(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

相关文章

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.