C語言之二叉排序樹
阿新 • • 發佈:2018-12-15
typedef struct BiTNode
{
int data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}Bintree;
#include<stdlib.h>
#include<string.h>
#include"list.h"
int BTSearch(Bintree *T,int key,Bintree *f,Bintree **p) //T代表樹,f為T的雙親,初始為NULL,key查詢的值, p指向查詢路徑上訪問的最後一個節點並返回0 //查詢操作
{
if(T==NULL) //查詢不成功
{
*p=f;
return 0;
}
else if(key==T->data)
{
*p=T;
return 1;
}
else if(key<T->data)
{
return BTSearch(T->lchild,key,T,p);
}
else
{
return BTSearch(T->rchild,key,T,p);
}
} int InsertBSTree(Bintree **T,int key) //插入操作 //每執行一次插入操作,T儲存下來,f,p重置
{
Bintree *p,*s;
if(!BTSearch(*T,key,NULL,&p))
{
s=(Bintree *)malloc(sizeof(Bintree));
s->data=key;
s->lchild=s->rchild=NULL;
if(p==NULL)
*T=s;
else if(key<p->data)
p->lchild=s;
else
p->rchild=s;
return 1;
}
else
return 0;
}
int Delete(Bintree **p)
{
Bintree *q,*s;
if((*p)->rchild==NULL)
{
q=*p;
*p=(*p)->lchild;
free(q);
}
else if((*p)->lchild==NULL)
{
q=*p;
*p=(*p)->rchild;
free(q);
}
else
{
q=*p;
s=(*p)->lchild;
while(s->rchild)
{
q=s;
s=s->rchild;
}
(*p)->data=s->data;
if(q!=*p)
{
q->rchild=s->lchild;
}
else
{
q->lchild=s->lchild;
}
free(s);
}
return 1;
}
int DeleteBST(Bintree **T,int key)
{
if(*T==NULL)
{
return 0;
}
else
{
if(key==(*T)->data)
{
return Delete(T);
}
else if(key<(*T)->data)
{
return DeleteBST(&(*T)->lchild,key);
}
else
{
return DeleteBST(&(*T)->rchild,key);
}
}
} void Display(Bintree *T) //顯示
{
if(T)
{
printf("%d ",T->data);
Display(T->lchild);
Display(T->rchild);
}
} int main()
{
int i,n;
int key;
int a[10];
Bintree *T=NULL;
printf("輸入n個數據\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
InsertBSTree(&T,a[i]); //T的話因為T在函式裡的操作返回後記憶體釋放掉 所以要傳遞地址
}
printf("請輸入要刪除的值\n");
scanf("%d",&key);
DeleteBST(&T,key);
Display(T);
return 0;
} 本樣例建議斷點跟蹤檢視二叉排序樹結構