二叉排序树查找的c语言程序,C语言二叉排序(搜索)树实例

本文实例为大家分享了C语言二叉排序(搜索)树实例代码,供大家参考,具体内容如下

/**1.实现了递归 非递归插入(创建)二叉排序(搜索)树;

分别对应Insert_BinSNode(TBinSNode* T,int k),NonRecursion_Insert_BinSNode(TBinSNode* T,int k);

2.实现了递归 非递归查找 二叉排序(搜索)树 ;

分别对应Find_BinSNode(TBinSNode *T,int s),NonRecursion_Find_BinSNode(TBinSNode *T,int s);

3. 实现了非递归删除 二叉排序(搜索)树;

分别对应Delete_BinSNode();

4. 实现了递归先序、中序、后序遍历二叉排序(搜索)树;

分别对应Pre_Print_BinSNode(TBinSNode T),In_Print_BinSNode(TBinSNode T),Post_Print_BinSNode(TBinSNode T);

*/

#include

#include

typedef struct BinSTreeNode{

int num;

struct BinSTreeNode *lchild,*rchild;

}BinSNode,*TBinSNode;

int Empty_Tree(TBinSNode T){

if(!T){

return 1;

}else{

return 0;

}

}

/*---------------------非递归方法 二叉排序树的删除-----------------*/

void Delete_BinSNode(TBinSNode *T,int del){

TBinSNode cur,pre,lt,rblast;

cur=*T;

pre=NULL;

//如果二叉排序树为空

if(Empty_Tree(cur)){

printf("Sorry,Tree is none");

return;

}

//如果二叉排序树不为空,先找到即将删除的元素del.这里再次实现一遍查找,当然也可以修改一下Find类的函数

while(cur && cur->num!=del){

if(del>cur->num){

pre=cur;

cur=cur->rchild;

}else{

pre=cur;

cur=cur->lchild;

}

}

if(!cur){

printf("Sorry,you want to delete the node,which is non-existent");

return;

}

if(cur->num==del){

printf("find the delete node,wait a minute.......\n");

}

//如果找到待删除的结点,立刻判断该结点有无左子树

//情况一:待删除结点无左子树

if(!cur->lchild){

if(pre==NULL){

cur=*T;

*T=(*T)->rchild;

free(cur);

return;

}

if(pre->lchild && pre->lchild->num==del){

pre->lchild=cur->rchild;

free(cur);

return;

}

if(pre->rchild && pre->rchild->num==del){

pre->rchild=cur->rchild;

free(cur);

return;

}

}

//情况二:待删除的结点有左子树。

if(cur->lchild){

lt=cur->lchild;

//情况2.1:该左子树无右子树

if(!lt->rchild){

if(pre->lchild && pre->lchild->num==del){

pre->lchild=lt;

free(cur);

return;

}

if(pre->rchild && pre->rchild->num==del){

pre->rchild=lt;

free(cur);

return;

}

}

//情况2.2:该左子树有右子树

if(lt->rchild){

while(lt->rchild){

rblast=lt; //该左子树中最大的结点的前一个结点.

lt=lt->rchild;

}

cur->num=lt->num;

rblast->rchild=lt->lchild;

free(lt);

return;

}

}

}

/*--------------------递归方法 查找 二叉排序树-------------------*/

void Find_BinSNode(TBinSNode T,int s){

if(s==T->num){

printf("%d\n",T->num);

return;

}

if(s>T->num){

Find_BinSNode(T->rchild,s);

}else{

Find_BinSNode(T->lchild,s);

}

}

/*-------------------非递归方法 查找二叉排序树--------------------*/

void NonRecursion_Find_BinSNode(TBinSNode T,int s){

if(Empty_Tree(T)){

printf("Tree is none");

return;

}

while(T && s!=T->num ){

if(s>T->num){

T=T->rchild;

}else{

T=T->lchild;

}

}

if(!T){

printf("Sorry,Not Find!");

exit(0);

}

if(s==T->num){

printf("%d\n",T->num);

}

}

/*-----------------递归方法 创建/插入 二叉排序树------------------*/

void Insert_BinSNode(TBinSNode *T,int k){

// int n;

TBinSNode node;

// scanf("%d",&n);

if(Empty_Tree(*T)){

*T=(TBinSNode)malloc(sizeof(BinSNode));

(*T)->num=k;

(*T)->lchild=(*T)->rchild=NULL;

return;

}else{

if(k>(*T)->num){

Insert_BinSNode(&(*T)->rchild,k);

}else{

Insert_BinSNode(&(*T)->lchild,k);

}

}

}

/*----------------------先序遍历二叉排序树----------------------------------*/

void Pre_Print_BinSNode(TBinSNode T){

if(T){

printf("%d ",T->num);

Pre_Print_BinSNode(T->lchild);

Pre_Print_BinSNode(T->rchild);

}

}

/*-----------------------中序遍历二叉排序树-----------------------------------*/

void In_Print_BinSNode(TBinSNode T){

if(T){

In_Print_BinSNode(T->lchild);

printf("%d ",T->num);

In_Print_BinSNode(T->rchild);

}

}

/*-----------------------后序遍历二叉排序树-----------------------------------*/

void Post_Print_BinSNode(TBinSNode T){

if(T){

Post_Print_BinSNode(T->lchild);

Post_Print_BinSNode(T->rchild);

printf("%d ",T->num);

}

}

/*---------------------非递归 创建/插入 二叉排序树---------------------------*/

void NonRecursion_Insert_BinSNode(TBinSNode *T,int k){

//如果为空的二叉排序树

TBinSNode cur,p,t;

t=*T;

if(!*T){

*T=(TBinSNode)malloc(sizeof(BinSNode));

(*T)->num=k;

(*T)->lchild=(*T)->rchild=NULL;

return;

}else{ //二叉排序树不为空。

while(t){

if(k>t->num){

cur=t;

t=t->rchild;

}else{

cur=t;

t=t->lchild;

}

}

p=(TBinSNode)malloc(sizeof(BinSNode));

p->num=k;

p->lchild=p->rchild=NULL;

if(k>cur->num){

cur->rchild=p;

}

if(knum){

cur->lchild=p;

}

}

}

int main(void){

TBinSNode T=NULL;

int k,s,del;//创建的 查找的 删除的

while(scanf("%d",&k) && k){

// Insert_BinSNode(&T,k);

NonRecursion_Insert_BinSNode(&T,k);

}

// scanf("%d",&s);

// Find_BinSNode(T,s);

// NonRecursion_Find_BinSNode(T,s);

Pre_Print_BinSNode(T);

scanf("%d",&del);

Delete_BinSNode(&T,del);

Pre_Print_BinSNode(T);

return 0;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是编程之家为你收集整理的C语言二叉排序(搜索)树实例全部内容,希望文章能够帮你解决C语言二叉排序(搜索)树实例所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

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

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

相关文章

[你必须知道的.NET] 第八回:品味类型---值类型与引用类型(上)-内存有理

本文将介绍以下内容: 类型的基本概念 值类型深入引用类型深入值类型与引用类型的比较及应用1. 引言 买了新本本,忙了好几天系统,终于开始了对值类型和引用类型做个全面的讲述了,本系列开篇之时就是因为想写这个主题,…

linux init 7,Linux 之 init命令

一、init是Linux系统操作中不可缺少的程序之一。所谓的init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式&am…

[你必须知道的.NET]第九回:品味类型---值类型与引用类型(中)-规则无边

接上回[第八回:品味类型---值类型与引用类型(上)-内存有理]的探讨,继续我们关注值类型和引用类型的话题。 本文将介绍以下内容: 类型的基本概念 值类型深入引用类型深入值类型与引用类型的比较及应用1. 引…

md5字符串输入c语言,请问C语言怎么实现对一长串字符进行MD5加密?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼typedef unsigned char *POINTER;typedef unsigned short int UINT2;typedef unsigned long int UINT4;#define S11 7#define S12 12#define S13 17#define S14 22#define S21 5#define S22 9#define S23 14#define S24 20#define …

[你必须知道的.NET]第十回:品味类型---值类型与引用类型(下)-应用征途

本文将介绍以下内容: 类型的基本概念 值类型深入引用类型深入值类型与引用类型的比较及应用 [下载]:[类型示例代码] 1. 引言 值类型与引用类型的话题经过了两个回合([第八回:品味类型---值类型与引用类型(上&#xf…

lfsr算法c语言,求助:如何用C语言实现LFSR加密

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼includevoidLFSR(unsigned char pzt[],unsigned char pjg[],int n){unsigned char t0;int c0,i;for(i0;it^(pzt[i]&pjg[i]);t^((t<<1)^(t<<2)^(t<<3)^(t<<4)^(t<<5)^(t<<6)^(t<<7))…

c语言提供了三种预处理命令,9、C语言之预处理命令

预处理命令基本概念&#xff1a;ANSI C标准规定可以在C源程序中加入一些“预处理命令”&#xff0c;以改进程序设计环境&#xff0c;提高编程效率。这些预处理命令是由ANSI C同一规定的&#xff0c;但是它们不是C语言本身的组成部分&#xff0c;不能直接对它们进行编译(因为编译…

[你必须知道的.NET]第十一回:参数之惑---传递的艺术(上)

本文将介绍以下内容&#xff1a; 按值传递与按引用传递深论ref和out比较 参数应用浅析 1. 引言 接上回《第九回&#xff1a;品味类型---值类型与引用类型&#xff08;中&#xff09;&#xff0d;规则无边》中&#xff0c;对值类型和引用类型的讨论&#xff0c;其中关于string…

[你必须知道的.NET]第十二回:参数之惑---传递的艺术(下)

本文将介绍以下内容&#xff1a; 按值传递与按引用传递深论ref和out比较 参数应用浅析 接上篇继续&#xff0c;『第十一回&#xff1a;参数之惑---传递的艺术&#xff08;上&#xff09;』 4.2 引用类型参数的按值传递 当传递的参数为引用类型时&#xff0c;传递和操作的是指…

android 自定义相机源码,Android 自定义相机及分析源码

Android 自定义相机及分析源码使用Android 系统相机的方法&#xff1a;要想让应用有相机的action&#xff0c;咱们就必须在清单文件中做一些声明&#xff0c;好让系统知道&#xff0c;如下action的作用就是声明action的类型&#xff0c;便于Intent的使用&#xff0c;category的…

[你必须知道的.NET]第十三回:从Hello, world开始认识IL

本文将介绍以下内容&#xff1a; IL代码分析方法 Hello, world历史 .NET学习方法论1. 引言 1988年Brian W. Kernighan和Dennis M. Ritchie合著了软件史上的经典巨著《The C programming Language》&#xff0c;我推荐所有的程序人都有机会重温这本历史上的经典之作。从那时起…

android服务器怎么做的,[Android]Android 制作一个HTTP服务器应用

上传文件开始想用apache的开源库获取文件&#xff0c;但是失败了&#xff0c;要么文件不全&#xff0c;要么就完全为空&#xff0c;还是自己写。文件上传请求头的部分内容contentType:multipart/form-data; boundary----WebKitFormBoundaryHpUAY0qCryu0Oc7o我们需要获取boundar…

[你必须知道的.NET]第十四回:认识IL代码---从开始到现在

本文将介绍以下内容&#xff1a; IL代码分析方法 IL命令解析 .NET学习方法论 1. 引言 自从『你必须知道.NET』系列开篇以来&#xff0c;受到大家很多的关注和支持&#xff0c;给予了anytao巨大的鼓励和动力。俱往昔&#xff0c;我发现很多的园友都把…

android 获取服务对象,android 如何取得正在运行的service对象

在写有关推送的代码&#xff0c;用的长连接的方式。具体逻辑&#xff1a;登录时 启service&#xff0c;service中启一个线程&#xff0c;线程中构建一个CommunicateManegr对象&#xff0c;此对象里面有一个BlockingDeque双端队列处理包的顺序问题&#xff0c; 还有若干线程分别…

[你必须知道的.NET]第十五回:继承本质论

本文将介绍以下内容&#xff1a; 什么是继承&#xff1f;继承的实现本质1. 引言 关于继承&#xff0c;你是否驾熟就轻&#xff0c;关于继承&#xff0c;你是否了如指掌。 本文不讨论继承的基本概念&#xff0c;我们回归本质&#xff0c;从编译器运行的角度来揭示.NET继承中的…

海岸鸿蒙2018年标准物质,海岸鸿蒙——20年权威的标准物质研制单位

摘要&#xff1a;海岸鸿蒙创办于1996年&#xff0c;是专业从事国家标准物质研发、生产、销售的高新技术企业。海岸鸿蒙创办于1996年&#xff0c;是专业从事国家标准物质研发、生产、销售的高新技术企业。海岸鸿蒙自创办以来&#xff0c;一直秉持“以市场为导向&#xff0c;以科…

[你必须知道的.NET]第十六回:深入浅出关键字---using全接触

本文将介绍以下内容&#xff1a; using指令的多种用法using语句在Dispose模式中的应用1. 引言 在.NET大家庭中&#xff0c;有不少的关键字承担了多种角色&#xff0c;例如new关键字就身兼数职&#xff0c;除了能够创建对象&#xff0c;在继承体系中隐藏基类成员&#xff0c;还在…

华为双系统是鸿蒙系统吗,华为p50pro是鸿蒙系统吗-华为p50pro有双系统吗

华为p50pro的外观基本上就是延续了上一代的风格&#xff0c;没有什么太大的变化&#xff0c;不过影像能力还是非常令人期待的&#xff0c;下面一起来了解华为p50pro的系统方面&#xff0c;看看有没有你暂所不知的消息。近日&#xff0c;有消息曝光了华为 P50 Pro将会有 Harmony…

[你必须知道的.NET]第十七回:貌合神离:覆写和重载

本文将介绍以下内容&#xff1a; 什么是覆写&#xff0c;什么是重载覆写与重载的区别覆写与重载在多态特性中的应用1. 引言 覆写&#xff08;override&#xff09;与重载&#xff08;overload&#xff09;&#xff0c;是成就.NET面向对象多态特性的基本技术之一&#xff0c;两…

鸿蒙系统正式开源,余承东:鸿蒙系统正式开源,友商也可以使用!

鸿蒙OS2.0正式开源&#xff1a;从PPT走向前台&#xff0c;该谁脸红了&#xff1f;在9月10日的开发者大会上&#xff0c;华为鸿蒙2.0发布&#xff0c;已经不再是某些人嘴中的PPT、又哄又蒙的鸿蒙了。说鸿蒙是PPT的言论&#xff0c;在前不久还能看到&#xff0c;如今鸿蒙已经发布…