C语言之二叉排序树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40667484/article/details/80874512

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;
}
本样例建议断点跟踪查看二叉排序树结构


猜你喜欢

转载自blog.csdn.net/qq_40667484/article/details/80874512