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

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序