【数据结构基础】二叉排序(搜索)树
来源:互联网 发布:绝世神偷网络电影 编辑:程序博客网 时间:2024/05/19 14:17
/**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<stdio.h>#include<stdlib.h>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(k<cur->num){ 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;}
阅读全文
0 0
- 【数据结构基础】二叉排序(搜索)树
- 【数据结构基础】二叉搜索(排序)树的基本操作
- 数据结构之二叉搜索树(排序树)HDU 3791
- 数据结构(二叉搜索树)
- 数据结构(C++)——排序二叉树(二叉搜索树)
- 二叉树应用-二叉搜索树类模板的实现(数据结构基础 第6周)
- 二叉树应用-二叉搜索树(数据结构基础 第6周)
- 二叉搜索(排序)树
- 数据结构二叉搜索树
- 数据结构-----二叉搜索树
- 数据结构:二叉搜索树
- 数据结构 ---- 二叉搜索树
- 数据结构-二叉搜索树
- 【数据结构】二叉搜索树
- 【数据结构】二叉搜索树
- 数据结构---------二叉搜索树
- 数据结构--‘搜索二叉树’
- 【数据结构】二叉搜索树
- 研究生实证论文数据经验分享
- 六、集合之TreeMap
- 序列化和反序列化漏洞的简单理解
- vmware12安装centos7系统详解
- ios手机底部input不兼容fixed(被键盘影响)
- 【数据结构基础】二叉排序(搜索)树
- JS,C#,Java随机生成六位数
- Android系统开机启动到Launcher流程总结
- 在O(1)的时间删除链表结点
- mt7688/mt7628 spi通信
- HK + FFMPEG + X264 + QSV + libRTMP + FMS踩了坑
- 使用json解析String数组
- 关于vue中修改export default中脚本报一大堆错的问题
- 判断一个二叉树是否是平衡二叉树