1. 程式人生 > >C語言之二叉排序樹

C語言之二叉排序樹

typedef struct BiTNode
{
 int  data;
 struct BiTNode *lchild;
 struct BiTNode *rchild;
}Bintree;
 

#include<stdio.h>
#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;
} 本樣例建議斷點跟蹤檢視二叉排序樹結構