二叉排序树实验7

#include<cstdio>
#include<cstdlib>
#define  FALSE 0
#define  TRUE  1 
typedef   int  KeyType;
/*二叉排序树的数据结构*/
typedef struct BSTNode
{
    KeyType key; 
    struct BSTNode *lchild,*rchild;       
}BSTNode,*BSTree;

/*插入*/ 
BSTree Insert(BSTree tree,KeyType key)
{
    BSTree p=tree;
    BSTree s,f;
    while(p!=NULL)
    {
       f=p;
       if(key==p->key) // 根是要查找的关键字   
           return tree;
       if(key<p->key)  //左子树  
           p=p->lchild;
       else  p=p->rchild;              
    }   
    s=(BSTree)malloc(sizeof(BSTNode));  //查找不成功 
    s->key=key;  //创建新的节点 
    s->lchild=NULL;
    s->rchild=NULL;  
    if(tree==NULL)  return s; // tree为空,返回创建的新节点 s  
    if(key<f->key) // p=tree,  f=p, 如果 tree 不是空的,创建的节点 s ,为左孩子 
       f->lchild=s;
    else  f->rchild=s; // 为右孩子 
    return tree;   
}
/*创建二叉排序树*/ 
BSTree  Create()
{
    KeyType  key;
    BSTree tree=NULL;  //初始化  tree  
    scanf("%d",&key);
    while(key!=0)
    {
       tree=Insert(tree,key);
       scanf("%d",&key);              
    }  
    return tree;   
}
//查找关键字 
BSTree Search(BSTree tree,KeyType key)
{
   BSTree p=tree; 
   int flag=0;  //标记查找不到的情况 
   while(p!=NULL)  // tree 非空 
   {
      if(p->key==key)  
      {
         printf("查找到该节点!\n");
         printf("%d\n",p->key);
         flag=1;
         return p;
         break;                 
      } 
      if(key<p->key) // 左边查找 
         p=p->lchild;
      else  p=p->rchild;  // 右边查找      
   }  
   if(flag==0)
   {
      printf("查找不到该 %d 关键字!",key);
      return NULL;           
   }      
}
/*中序遍历*/
void Traverse(BSTree tree)
{
   if(tree)
   {
      Traverse(tree->lchild);
      printf("%d  ",tree->key);
      Traverse(tree->rchild);           
   }     
} 

int Delete(BSTree &p)
{   
    BSTree q,s;
    if(!p->rchild) // 右子树空连接它的左子树 
    {
        q=p;
        p=p->lchild;
        free(q);
    } 
    else if(!p->lchild) // 左子树空连接它的右子树 
         {
             q=p;
             p=p->rchild;
             free(q);
         } 
    else {  // 左右子树均不空 
            q=p;
            s=p->rchild; // 后继 
            while(s->lchild) // 右转后,到左尽头 
               {
                  q=s;
                  s=s->lchild;           
               }
            p->key=s->key; // s 被删节点的后继 
            if(q!=p)
              q->lchild=s->rchild; //重接  左子树 
            else q->rchild=s->rchild; // 重接 右子树 
            delete s;
         }
    return TRUE;
}// Delete

/*删除*/
int DeleteBST(BSTree &tree,KeyType key) 
{
   if(!tree)
   return FALSE;
   else {
            if(key==tree->key)
            {
               Delete(tree);
               return TRUE;
            }
            else if(key<tree->key)
            DeleteBST(tree->lchild,key);
            else  DeleteBST(tree->rchild,key);
        }
}// DeleteBST

BSTree tree;
int main()
{
   BSTree tree,p;
   int key1,key2,key3;
   int m;
   printf("-------------------------\n");
   printf("1、创建二叉排序树.\n");
   printf("2、查找关键字.\n") ;
   printf("3、插入关键字.\n");
   printf("4、删除关键字.\n");
   printf("5、退出.\n");
   printf("-------------------------\n");
   while(1)
   {
       printf("请选择 1-5步骤:\n");
       scanf("%d",&m);
       switch(m)
       {
         case 1:
              {  
                 printf("请输入储存的信息,以 0 结束:\n");
                 tree=Create();
                 printf("\n");
                 Traverse(tree);
                 printf("\n");
                 break;      
              } 
          case 2:
               {
                  printf("请输入要查找的关键字:\n");
                  scanf("%d",&key1);
                  p=Search(tree,key1);
                  printf("\n");
                  Traverse(tree);
                  printf("\n");
                  break;              
               } 
          case 3:
               {
                   printf("请输入要插入的关键字:\n");
                   scanf("%d",&key2);
                   Insert(tree,key2);
                   printf("插入后的中序遍历为:\n");
                   Traverse(tree);
                   printf("\n");
                   break;                                    
               } 
           case 4:
                {
                    printf("请输入要删除的关键字:\n");
                    scanf("%d",&key3);
                    DeleteBST(tree,key3);
                    printf("删除后的中序遍历为:\n");
                    Traverse(tree);
                    printf("\n");  
                    break;                                                 
                } 
           case 5:
                return 0;
           default:return 0;              
       }
   printf("-------------------------\n");
   printf("1、创建二叉排序树.\n");
   printf("2、查找关键字.\n") ;
   printf("3、插入关键字.\n");
   printf("4、删除关键字.\n");
   printf("5、退出.\n");
   printf("-------------------------\n");
   }
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值