二叉排序树实验7

来源:互联网 发布:丝绸之路大数据 编辑:程序博客网 时间:2024/06/07 22:03
#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);        }}// DeleteBSTBSTree 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;}

0 0
原创粉丝点击