C語言二叉排序(搜索)樹實(shí)例
本文實(shí)例為大家分享了C語言二叉排序(搜索)樹實(shí)例代碼,供大家參考,具體內(nèi)容如下
/**1.實(shí)現(xiàn)了遞歸 非遞歸插入(創(chuàng)建)二叉排序(搜索)樹;
分別對應(yīng)Insert_BinSNode(TBinSNode* T,int k),NonRecursion_Insert_BinSNode(TBinSNode* T,int k);
2.實(shí)現(xiàn)了遞歸 非遞歸查找 二叉排序(搜索)樹 ;
分別對應(yīng)Find_BinSNode(TBinSNode *T,int s),NonRecursion_Find_BinSNode(TBinSNode *T,int s);
3. 實(shí)現(xiàn)了非遞歸刪除 二叉排序(搜索)樹;
分別對應(yīng)Delete_BinSNode();
4. 實(shí)現(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.這里再次實(shí)現(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é)點(diǎn),立刻判斷該結(jié)點(diǎn)有無左子樹
//情況一:待刪除結(jié)點(diǎ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;
}
}
//情況二:待刪除的結(jié)點(diǎn)有左子樹。
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é)點(diǎn)的前一個(gè)結(jié)點(diǎn).
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í)有所幫助,也希望大家多多支持我們。
欄 目:C語言
下一篇:C++ 中boost::share_ptr智能指針的使用方法
本文標(biāo)題:C語言二叉排序(搜索)樹實(shí)例
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/1100.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改


