数据结构--6.5二叉排序树(插入,查找和删除)

news/2024/11/30 14:33:50/

目录

一、创建

 二、插入

三、删除


 

二叉排序树(Binary Sort Tree)又称为二叉查找树,它或者是一棵空树,或者是具有下列性质的二叉树:

——若它的左子树不为空,则左子树上所有结点的值均小于它的根结构的值;

——若它的右子树不为空,则右子树上所有结点的值均大于它的根结构的值;

——它的左、右子树也分为二叉排序树(递归)。

一、创建

//二叉树的二叉链表结点结构定义
typedef struct BiTNOde
{int data;struct BiTNode * lchild,*rchild;
}BiTNode, *BiTree;//递归查找二叉排序树T中是否存在key
//指针f指向T的双亲,其初始值调用值为NULL
//若查找成功,则指针p指向该数据元素结点,并返回TRUE
//否则指针p指向查找路径上访问的最后一个结点,并返回FALSE
Status SearchBST(BiTree T,int key,BiTree f,BiTree *p)
{if(!T)   //查找不成功{*p = f;return FALSE; } else if(key == T->data){return SearchBST(T->lchild,key,T,p);    //在左子树继续查找 }else{return SearchBST(T->rchild,key,T,p);   //在右子树继续查找 } 
} 

 二、插入

//insertBST
//当二叉排序树T中不存在关键字等于key的数据元素时
Status InsertBST(BiTree *T,int key)
{BiTree p,s;if(!SearchBST(*T,key,NULL,&p)){s = (BiTree)malloc(sizeof(BiTNode));s->data = key;s->lchild = s->rchild = NULL;if(!p)		//查找不到key {*T = s; //插入s为新的根结点 }else if(key < p->data){p->lchild = s; //插入s为左孩子 } else {p->rchild = s; //插入s为右孩子 } return TURE; }else{return FALSE; //树中已有关键字相同的结点,不再插入 }} 

三、删除


Status DeleteBST(BiTree *T,int key)
{if(!*T){return FALSE;}else{if(key == (*T)->data){return Delete(T);}else if(key < (*T)->data){return DeleteBST(&(*T)->lchild,key);}else if(key > (*T)->data){return DeleteBST(&(*T)->rchild,key);}}} Status Delete(BiTree *p)
{BiTree q,s;if((*p)->rchild == NULL){p = *p;*p = (*p)->lchild;free(q);}else if((*p)->lchild == NULL){q = *p;*p = (*p)->rchild;free(q);}else{q = *p;s = (*p)->lchild;while(s->rchild){q = s;s = s->rchild;}(*p)->data = s->data;if(q  != p){q->rchild = s->lchild;}else{q->lchild = s->lchild;}free(s);}return tree;
}


http://www.ppmy.cn/news/1102132.html

相关文章

postman和node.js的使用

一 nodejs下载 下载链接&#xff1a; nodejs官网&#xff1a; https://nodejs.org/zh-cn/download 我使用的windows .msi安装方式&#xff0c;双击一直下一步就行 当前安装完成后的版本&#xff1a;1.下载 2.安装步骤 下载完成后&#xff0c;双击安装包&#xff0c;开始安装&…

C# 命令行参数分割

CommandLineToArgvW 函数 [DllImport("shell32.dll", SetLastError true)] private static extern IntPtr CommandLineToArgvW([MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine, out int pNumArgs); 参数&#xff1a; [in] lpCmdLine 类型&#xff1a;…

振弦采集仪应用地铁隧道安全监测详细解决方案

振弦采集仪应用地铁隧道安全监测详细解决方案 随着城市化进程的不断加快&#xff0c;地铁作为一种高效、便捷、环保的交通方式已经成为现代城市不可或缺的一部分。因此&#xff0c;对地铁的安全性也越来越重视&#xff0c;一般二三线以上的城市在不断发展中&#xff0c;地铁做…

linux系统中固化和更新uboot、zImage和dtb方法(经典)

​ 大家好&#xff0c;今天给大家介绍一下imx6ull固化和更新uboot、zImage和dtb方法总结&#xff0c;希望这篇文章对大家有所帮助。 进行固化和更新的前提&#xff0c;uboot.imx、zImage、imx6ull.dtb和rootfs已经编译好&#xff0c;并且能成功启动和挂载。 在讲解imx6ull固…

Nginx和Tomcat负载均衡实现session共享

以前的项目使用Nginx作为反向代理实现了多个Tomcat的负载均衡&#xff0c;为了实现多个Tomcat之间的session共享&#xff0c;使用了开源的Memcached-Session-Manager框架。 此框架的优势&#xff1a; 1、支持Tomcat6和Tomcat7 2、操作粘性或不黏性Session 3、没有单点故障 4、T…

javascript【格式化时间日期】

javascript【格式化时间日期】 操作&#xff1a; (1) 日期格式化代码 /*** 日期格式化函数<br/>* 调用格式&#xff1a;需要使用日期对象调用* <p> new Date().Format("yyyy/MM/dd HH:mm:ss"); </p>* param fmt 日期格式* returns {*} 返回格式化…

在Postman的脚本中使用pm对象获取接口的请求参数

在Postman的脚本中使用pm对象获取接口的请求参数 1、获取在Query Params中输入的参数全局变量的引用&#xff08;以在header中引用为例&#xff09;2、获取在Body中输入的参数3、pm对象常用用法 1、获取在Query Params中输入的参数 query params页面 在tests中写脚本做后置处…

入门人工智能 —— 使用 Python 进行文件读写,并完成日志记录功能(4)

入门人工智能 —— 使用 Python 进行文件读写&#xff08;4&#xff09; 入门人工智能 —— 使用 Python 进行文件读写打开文件读取文件内容读取整个文件逐行读取文件内容读取所有行并存储为列表 写入文件内容关闭文件 日志记录功能核心代码&#xff1a;完整代码&#xff1a;运…