C語言二叉排序(搜索)樹實例
本文實例為大家分享了C語言二叉排序(搜索)樹實例代碼,供大家參考,具體內(nèi)容如下
/**1.實現(xiàn)了遞歸 非遞歸插入(創(chuàng)建)二叉排序(搜索)樹; 分別對應(yīng)Insert_BinSNode(TBinSNode* T,int k),NonRecursion_Insert_BinSNode(TBinSNode* T,int k); 2.實現(xiàn)了遞歸 非遞歸查找 二叉排序(搜索)樹 ; 分別對應(yīng)Find_BinSNode(TBinSNode *T,int s),NonRecursion_Find_BinSNode(TBinSNode *T,int s); 3. 實現(xiàn)了非遞歸刪除 二叉排序(搜索)樹; 分別對應(yīng)Delete_BinSNode(); 4. 實現(xiàn)了遞歸先序、中序、后序遍歷二叉排序(搜索)樹; 分別對應(yīng)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.這里再次實現(xiàn)一遍查找,當(dāng)然也可以修改一下Find類的函數(shù) 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"); } //如果找到待刪除的結(jié)點,立刻判斷該結(jié)點有無左子樹 //情況一:待刪除結(jié)點無左子樹 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; } } //情況二:待刪除的結(jié)點有左子樹。 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; //該左子樹中最大的結(jié)點的前一個結(jié)點. 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); } } /*-----------------遞歸方法 創(chuàng)建/插入 二叉排序樹------------------*/ 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); } } /*---------------------非遞歸 創(chuàng)建/插入 二叉排序樹---------------------------*/ 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;//創(chuàng)建的 查找的 刪除的 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; }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
VS2019添加引用出錯:對COM組件的調(diào)用返回了錯誤HRESULT E_FAIL(未能完成操作未指定的錯誤)
這篇文章主要介紹了VS2019添加引用出錯:對COM組件的調(diào)用返回了錯誤HRESULT E_FAIL(未能完成操作。未指定的錯誤),需要的朋友可以參考下2020-07-07C語言時間函數(shù)的ctime()和gmtime()你了解嗎
這篇文章主要為大家詳細(xì)介紹了C語言時間函數(shù)的ctime()和gmtime(),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02C/C++函數(shù)參數(shù)聲明解析int?fun()?與?int?fun(void)?的區(qū)別講解
C++中int fun()和int fun(void)的區(qū)別在于函數(shù)參數(shù)的聲明方式,前者默認(rèn)允許任意參數(shù),而后者表示沒有參數(shù),通過清晰的實例源代碼,詳細(xì)解釋了它們在函數(shù)聲明和調(diào)用中的不同之處,這篇文章介紹了C/C++函數(shù)參數(shù)聲明int?fun()與int?fun(void)的差異,需要的朋友可以參考下2024-01-01C++的QT項目打包成獨立可執(zhí)行和發(fā)布的exe文件(項目構(gòu)建過程)
這篇文章主要介紹了C++的QT項目打包成獨立可執(zhí)行和發(fā)布的exe文件(項目構(gòu)建過程),本文通過實例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-11-11C語言深入講解之從函數(shù)棧幀角度理解return關(guān)鍵字
在C語言中,一般情況下函數(shù)的返回值是通過函數(shù)中的return語句來實現(xiàn)的,每調(diào)用一次return語句只能從函數(shù)中返回一個值,這篇文章主要給大家介紹了關(guān)于C語言從函數(shù)棧幀角度理解return關(guān)鍵字的相關(guān)資料,需要的朋友可以參考下2021-09-09C++基礎(chǔ) class、struct、union詳細(xì)
這篇文章主要 給大家介紹的是C++基礎(chǔ) class、struct、union,主要由三部分組成,分別是、類class、結(jié)構(gòu)體struct、共用體union,需要的朋友可以參考一下2021-09-09