二叉排序树删(15.6)

#include <stdio.h>
#include <stdlib.h>
///二叉排序树,中序遍历,查找typedef int KeyType;
typedef struct BSTNode{KeyType key;struct BSTNode *lchild,*rchild;
}BSTNode,*BiTree;//二叉查找树核心
//非递归创建二叉查找树
int BST_Insert(BiTree& T,KeyType k)
{//子函数的传递 因为该函数是被下面函数引用的子函数 故引用与下方保持一致BiTree TreeNew= (BiTree)calloc(1,sizeof(BSTNode));TreeNew->key=k;//把值放入if(NULL==T){T=TreeNew;return 0;}BiTree p=T,parent;//用p来查找树while(p)//p是用来遍历的{parent=p;//parent用来存p的父亲 当p等于NULL时,parent存的刚好是NULLif(k>p->key){p=p->rchild;} else if(k<p->key){p=p->lchild;} else{return -1;//相等的元素不可以放入查找树,考研不会考相等元素放入问题}}//接下来判断放到父亲左边还是右边if(k>parent->key){parent->rchild=TreeNew;}else{//放到父亲左边parent->lchild=TreeNew;}return 0;
}//二叉排序树函数
void Creat_BST(BiTree& T,KeyType* str,int len)
{int i;for(i=0;i<len;i++){BST_Insert(T,str[i]);//把某个结点放入 二叉查找树;}
}//中序遍历有序输出(因为中序结果就相当于垂直投影 进而有序输出了排好序的树)
void InOrder(BiTree T)
{if(T!=NULL){InOrder(T->lchild);printf("%3d",T->key);InOrder(T->rchild);}
}BiTree BST_Insert(BiTree T,KeyType k,BiTree &parent)//parent是会变的因为相当于偏离的p
{parent=NULL;while (T!=NULL&&k!=T->key){parent=T;if(k>T->key){T=T->rchild;} else{T=T->lchild;}}return T;
}//递归方法删除树中结点
void DeleteNode(BiTree &root,KeyType x) //root是树根
{if(root==NULL){return;}if(root->key>x)//当前结点大于要删除的结点 往左子树去找{DeleteNode(root->lchild,x);} else if(root->key<x)//当前结点小于要删除的结点 往右子树去找{DeleteNode(root->rchild,x);} else{//找到了删除的结点 相等//刚好找到是最难的 如果是叶子结点直接删除需要补充完整 但如果是其它结点//删除后仍要保持树的完整性if(root->lchild==NULL)//左子树为空,右子树直接顶上去{BiTree tempNode=root;root=root->rchild;free(tempNode);}else if(root->rchild==NULL){BiTree tempNode=root;root=root->lchild;free(tempNode);}else{//两边都不为空//一般的删除策略是左子树的最大数据 或 右子树的最小数据//代替要删除的结点(这里采用查找左子树最大数据来代替(即左子树最右结点))BiTree  tempNode=root->lchild;while (tempNode->rchild!=NULL)//向右找最大的{tempNode=tempNode->rchild;}root->key=tempNode->key;//tempNode对应的值替换到要删除的值的位置上DeleteNode(root->lchild,tempNode->key);//在左子树中找到tempNode的值,把其删除}}
}int main() {BiTree T=NULL;//树根KeyType str[7]={54,20,66,40,28,79,58};//将要进入二叉排序树的元素值Creat_BST(T,str,7);InOrder(T);//中序遍历二叉查找树是由小到大的printf("\n");BiTree search,parent;search = BST_Insert(T,40,parent);if(search){printf("find key %d\n",search->key);} else{printf("not find\n");}DeleteNode(T,40);//删除某个结点InOrder(T);printf("\n");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/742301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java是不是没有指针呢?

在Java中&#xff0c;与C语言相比&#xff0c;指针的使用是受到限制的。Java的设计初衷是为了提供更高的安全性和可靠性&#xff0c;因此它采用了一些机制来避免常见的指针错误。 具体来说&#xff0c;Java中没有像C语言中那样的显式指针操作。Java中的引用可以看作是一种类似…

Zoho Mail有微信小程序啦!从微信就能直接收发邮件

Zoho Mail有微信小程序啦&#xff01;从微信就能直接收发邮件。可实现&#xff1a;从微信直接查看邮件、撰写新邮件、回复邮件。对于那些想从手机访问Zoho Mail企业邮箱来收发邮件&#xff0c;但又不想下载Zoho Mail 的手机app来占用手机存储的用户来说&#xff0c;微信小程序实…

Celery知识

celery介绍 # celery 的概念&#xff1a; * 翻译过来是芹菜 * 官网&#xff1a;https://docs.celeryq.dev/en/stable/ # 是分布式的异步任务框架&#xff1a; 分布式&#xff1a;一个任务&#xff0c;拆成多个任务在不同机器上做 异步任务&#xff1a;后台执行…

【开源】SpringBoot框架开发软件学院思政案例库系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理员2.2 普通教师 三、系统展示四、核心代码4.1 查询思政案例4.2 审核思政案例4.3 查询思政课程4.4 思政案例点赞4.5 新增思政案例评语 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的软件学…

Rust 如何优雅关闭 channel

在 Rust 的标准库中&#xff0c;std::sync::mpsc::channel 提供了一个多生产者单消费者的 channel 实现。这个 channel 并不直接支持“优雅关闭”的概念&#xff0c;因为发送端&#xff08;tx&#xff09;和接收端&#xff08;rx&#xff09;是通过独立的对象表示的&#xff0c…

python 基础练习题

目录 1、定义两个变量&#xff0c;交换两个变量【使用多种方式】 2、给定成绩&#xff0c;判断用户成绩的档次 3. 作业&#xff1a;下列哪一项是“4是奇数或-9为正数”的否定&#xff08; &#xff09; 4. 作业&#xff1a;判断一个整数是奇数还是偶数 5. 求矩形的面积和周…

Mysql8.0.30数据data目录文件解释

数据库内存和磁盘架构 data目录展示 [rootDESKTOP-9ADRUGP data]# pwd /usr/local/software/mysql/3312/data [rootDESKTOP-9ADRUGP data]# ls -l total 96616 -rw-r----- 1 systemd-coredump input 56 Jul 24 2023 auto.cnf -rw-r----- 1 systemd-coredump input 30…

Python的自定义数据格式

在Python中&#xff0c;自定义数据格式通常涉及到创建自定义的数据类型或类。这些类可以封装数据并定义如何处理这些数据。以下是一些关于如何在Python中自定义数据格式的详细解释&#xff1a; 1. 定义类 首先&#xff0c;你需要定义一个类来表示你的自定义数据格式。这个类可…

ElasticSearch 搜索推荐

Term Suggester "suggest_mode":"missing" missing 默认选项&#xff0c;不返回精准匹配到的分词结果 "suggest_mode":"popular" popular 大于等于搜索词频率的返回 "suggest_mode":"always", 不做任何限制&qu…

数据库基础理论知识

1.基本概念 数据(Data)&#xff1a;数据库存储的基本对象。数字、字符串、图形、图像、音频、视频等数据库(DB)&#xff1a;在计算机内&#xff0c;永久存储、有组织、可共享的数据集合数据库管理系统(DBMS)&#xff1a;管理数据库的系统软件数据库系统(DBS)&#xff1a;DBDBM…

深入理解现代软件开发中的数据格式与模式

引言 在现代软件开发中&#xff0c;数据的格式和模式起着至关重要的作用。数据格式定义了数据的结构和表示方式&#xff0c;而数据模式则规定了数据的组织结构、约束条件和关联关系。正确选择和使用适当的数据格式和模式不仅有助于提高数据的可读性和可维护性&#xff0c;还能…

某小厂java后端初面,记录一下

好吧&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;本人很菜&#xff0c;再接再励吧&#xff0c;继续刷。简单记录一下面试题&#xff0c;未亡羊补牢呗。 1.lift join ;inner join ;right join 的区别 2. union 和union all的区别 3.like查询会走索引吗&#x…

浏览器的工作原理

从输入一个url到页面加载完成&#xff0c;中间都发生了什么&#xff1f; 参考原文地址 首先在浏览器地址栏输入一个地址并回车之后&#xff0c; 1. DNS查找 浏览器会进行DNS查找&#xff0c;把域名https://example.com转化为真实的IP地址10.29.33.xx&#xff0c;根据IP地址找…

linux驱动——中断

1.Cortex-A系列的中断的简介 中断的基本概念&#xff1a;(interrupt) 中断本质上是系统内部的异常机制,当中断产生之后&#xff0c;他会停下当前正在执行的任务&#xff0c;转而去做其他的事情,在停下当前正在执行的任务之前,要先入栈&#xff08;保护现场,其他的事情做完之后…

Mysql/Redis缓存一致性

如何保证MySQL和Redis的缓存一致。从理论到实战。总结6种来感受一下。 理论知识 不好的方案 1.先写MySQL&#xff0c;再写Redis 图解说明: 这是一幅时序图&#xff0c;描述请求的先后调用顺序&#xff1b; 黄色的线是请求A&#xff0c;黑色的线是请求B&#xff1b; 黄色的…

python之面向对象

面向对象 class Func:def a1(self,name,age):print("我是{}今年{}岁了".format(name,age))def a2(self,home,price):print("我家在{}有{}钱".format(home,price)) objFunc() obj.a1("杨振浩",19) obj.a2("河南",100) #一般传递的参数…

基础 | 并发编程 - [线程状态]

INDEX 操作系统的线程状态 NEW&#xff1a;刚 newREDAY&#xff1a;刚 start()RUNNING&#xff1a;刚 run()BLOCKING&#xff1a;cpu 不能给此线程分配时间片TERMINATED&#xff1a;停止 JAVA 中的线程状态 NEW&#xff1a;刚 newRUNNING&#xff1a;刚 run()BLOCKING&#…

TYPE C模拟耳机POP音产生缘由

关于耳机插拔的POP音问题&#xff0c;小白在之前的文章中讲述过关于3.5mm耳机的POP音产生原因。其实这类插拔问题的POP音不仅仅存在于3.5mm耳机&#xff0c;就连现在主流的Type C模拟耳机的插拔也存在此问题&#xff0c;今天小白就来讲一讲这类耳机产生POP音的缘由。 耳机左右…

vue从零到一创建项目?

创建一个Vue项目通常需要经过以下步骤&#xff0c;从零开始构建一个基本的Vue项目&#xff1a; 步骤一&#xff1a;安装Node.js和npm 下载安装Node.js&#xff1a; 在Node.js官网下载适合你操作系统的Node.js安装包&#xff0c;并按照提示进行安装。安装完Node.js后&#xff…

Amazon Kinesis Analytics

现在让我们将注意力集中在 Amazon Kinesis Analytics 上。 Amazon Kinesis Analytics 使您能够快速编写 SQL 代码&#xff0c;以近乎实时的方式连续读取、处理和存储数据。 借助 Amazon Kinesis Analytics&#xff0c;您可以实时摄取数十亿个小数据点。 然后可以聚合每个单独…