[C++] 高级二叉树 →→→→→进入此内容的聊天室

来自 , 2019-12-10, 写在 C++, 查看 113 次.
URL http://www.code666.cn/view/08f90c1a
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct Bitree
  4. {
  5.     int key;
  6.     struct Bitree *lchild,*rchild;
  7. }Bitnode,*Bitree;
  8. bool Search(Bitree T,int key,Bitree f,Bitree *p)
  9. {
  10.     if(T==NULL)
  11.     {
  12.         *p=f;
  13.         return false;
  14.     }
  15.     else if(key==T->key)
  16.         {
  17.             *p=T;
  18.             return true;
  19.         }
  20.         else if(key<T->key)
  21.             {
  22.                 Search(T->lchild,key,T,p);
  23.             }
  24.         else
  25.             Search(T->rchild,key,T,p);
  26. }
  27. void CreateTree(Bitree *T,int n)
  28. {
  29.     int i,index;
  30.     Bitree p,s;
  31.     printf("请输入排序二叉树的关键字序列:");
  32.     for(i=1;i<=n;i++)
  33.     {
  34.  
  35.         scanf("%d",&index);
  36.         if(!Search(*T,index,NULL,&p))
  37.         {
  38.             s=(Bitree)malloc(sizeof(Bitnode));
  39.             s->key=index;
  40.             s->lchild=NULL;
  41.             s->rchild=NULL;
  42.             if(!p)
  43.                 *T=s;
  44.             else
  45.                 if(index<p->key)
  46.                 p->lchild=s;
  47.             else
  48.                 p->rchild=s;
  49.         }
  50.     }
  51. }
  52. void VisitBitree(Bitree T)
  53. {
  54.     if(T)
  55.     {
  56.         VisitBitree(T->lchild);
  57.         printf("%d->",T->key);
  58.         VisitBitree(T->rchild);
  59.     }
  60.  
  61. }
  62. void Delete(Bitree &p)
  63. {
  64.  
  65.     Bitree q,s;
  66.     if(!p->rchild)
  67.     {
  68.         q=p;
  69.         p=p->lchild;
  70.         free(q);
  71.     }
  72.     if(!p->lchild)
  73.     {
  74.         q=p;
  75.         p=p->rchild;
  76.         free(q);
  77.     }
  78.     else
  79.     {
  80.         q=p;
  81.         s=p->lchild;
  82.         while(s->rchild)
  83.         {
  84.             q=s;
  85.             s=s->lchild;
  86.         }
  87.         p->key=s->key;
  88.         if(q!=p)
  89.         {
  90.            q->rchild=s->lchild;
  91.         }
  92.         else
  93.             q->lchild=s->lchild;
  94.     }
  95. }
  96. bool DeleteB(Bitree *T,int x)
  97. {
  98.     if(!T)
  99.         return false;
  100.     else
  101.     {
  102.         if(x==T->key)
  103.         {
  104.             Delete(T);
  105.             return true;
  106.         }
  107.         else if(x<T->key)
  108.             DeleteB(T->lchild,x);
  109.         else
  110.             DeleteB(T->rchild,x);
  111.     }
  112. }
  113. int main()
  114. {
  115.     int n,x;
  116.     Bitree T=NULL;
  117.     printf("请输入排序树序列元素个数:\n");
  118.     scanf("%d",&n);
  119.     CreateTree(&T,n);
  120.  
  121.     printf("排序树序列中根访问序列:\n");
  122.     VisitBitree(T);
  123.     printf("\n");
  124.  
  125.     printf("输入你要删除的元素:");
  126.     scanf("%d",&x);
  127.     if(DeleteB(T,x))
  128.     {
  129.         printf("排序树修改后的序列中根访问序列如下:\n");
  130.         VisitBitree(T);
  131.         printf("\n");
  132.  
  133.     }
  134.     else
  135.         printf("删除失败!该元素不在序列中\n");
  136. }
  137.  

回复 "高级二叉树"

这儿你可以回复上面这条便签

captcha