鱼C论坛

 找回密码
 立即注册
查看: 2971|回复: 2

用二叉链表作存储结构实平衡的二叉排序树

[复制链接]
发表于 2016-11-9 20:53:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
用二叉链表作存储结构实平衡的二叉排序树。
      1)用数列L,生成平衡的二叉排序树BT:当插入新元素之后,发现
当前的二叉排序树BT不是平衡的二叉排序树,则立即将它转换成新的平
衡的二叉排序树BT;
      2)计算平衡的二叉排序树BT的平均查找长度,输出结果。



真的不知道为什么代码编译不出来
求大神检查,真的十分感谢




  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define LH 1
  4. #define EH 0
  5. #define RH -1
  6. typedef struct BSTNode
  7. {
  8.         int key;
  9.         int BF;
  10.         struct BSTNode *lchild,*rchild;
  11. }BSTNode,*BSTree;

  12. BSTree ll_rotate(BSTree *p)//左左旋转
  13. {
  14.         BSTree *s,*g;
  15.         *s=(*p)->lchild;
  16.         *g=(*s)->lchild;
  17.         (*p)->lchild=(*s)->rchild;
  18.         (*s)->rchild=(*p);
  19.         (*p)->BF=EH;
  20.         (*s)->BF=EH;
  21.         (*p)=*s;
  22.         return (*p);
  23. }

  24. BSTree lr_rotate(BSTree *p)//左右旋转
  25. {
  26.         BSTree *s,*g;
  27.         (*s)=(*p)->lchild;
  28.         (*g)=(*s)->lchild;
  29.         (*s)->rchild=(*g)->lchild;
  30.         (*p)->lchild=(*g)->rchild;
  31.         (*g)->lchild=(*s);
  32.         (*g)->rchild=(*p);
  33.         switch((*g)->BF)
  34.         {
  35.                 case LH:
  36.                         (*p)->BF=RH;
  37.                         (*s)->BF=EH;
  38.                         (*g)->BF=EH;
  39.                 case EH:
  40.                         (*p)->BF=EH;
  41.                         (*s)->BF=EH;
  42.                         (*g)->BF=EH;
  43.                 case RH:
  44.                         (*p)->BF=EH;
  45.                         (*s)->BF=LH;
  46.                         (*g)->BF=EH;
  47.         }
  48.         (*p)=(*g);
  49.         return (*p);
  50. }

  51. BSTree rl_rotate(BSTree *p)//右左旋转
  52. {
  53.         BSTree *s,*g;
  54.         (*s)=(*p)->rchild;
  55.         (*g)=(*p)->lchild;
  56.         (*p)->rchild=(*g)->lchild;
  57.         (*s)->lchild=(*g)->rchild;
  58.         (*s)->lchild=(*p);
  59.         (*g)->rchild=(*s);
  60.         switch((*g)->BF)
  61.         {
  62.                 case LH:
  63.                         (*p)->BF=EH;
  64.                         (*s)->BF=RH;
  65.                         (*g)->BF=EH;
  66.                 case EH:
  67.                         (*p)->BF=EH;
  68.                         (*s)->BF=EH;
  69.                         (*g)->BF=EH;
  70.                 case RH:
  71.                         (*p)->BF=LH;
  72.                         (*s)->BF=EH;
  73.                         (*g)->BF=EH;
  74.         }
  75.         (*p)=(*g);
  76.         return (*p);
  77. }

  78. BSTree rr_rotate(BSTree *p)//右右旋转
  79. {
  80.         BSTree *s,*g;
  81.         (*s)=(*p)->rchild;
  82.         (*g)=(*s)->rchild;
  83.         (*p)->rchild=(*s)->lchild;
  84.         (*s)->lchild=(*p);
  85.         (*p)->BF=EH;
  86.         (*s)->BF=EH;
  87.         (*p)=(*s);
  88.         return (*p);
  89. }
  90. BSTree leftbalance(BSTree *p)//左平衡
  91. {
  92.         BSTree *s;
  93.         (*s)=(*p)->lchild;
  94.         switch((*s)->BF)
  95.         {
  96.                 case LH:
  97.                         ll_rotate(p);
  98.                         break;
  99.                 case RH:
  100.                         lr_rotate(p);
  101.                         break;
  102.         }
  103. }

  104. BSTree rightbalance(BSTree *p)//右平衡
  105. {
  106.         BSTree *s;
  107.         (*s)=(*p)->rchild;
  108.         switch((*s)->BF)
  109.         {
  110.                 case LH:
  111.                         rl_rotate(p);
  112.                         break;
  113.                 case RH:
  114.                         rr_rotate(p);
  115.                         break;
  116.         }
  117. }

  118. int compare(int x,int y)
  119. {
  120.         if(x==y)        return 0;
  121.         else
  122.                 if(x<y)        return -1;
  123.                 else
  124.                         return 1;
  125. }

  126. int InsertAVL(BSTree *T,char e,bool *taller)//插入结点后,数长高,则×taller置为true
  127. {
  128.         int tmp;
  129.         if(!(*T))
  130.         {
  131.                 *T=(BSTree)malloc(sizeof(BSTNode));
  132.                 (*T)->key=e;
  133.                 (*T)->lchild=NULL;
  134.                 (*T)->rchild=NULL;
  135.                 *taller=true;
  136.         }
  137.         else
  138.         {
  139.                 tmp=compare(e,(*T)->key);
  140.                 switch(tmp)
  141.                 {
  142.                         case 0:
  143.                                 *taller=false;
  144.                                 return 0;
  145.                                 break;
  146.                         case -1:
  147.                                 if(!InsertAVL(&((*T)->lchild),e,taller))
  148.                                         return 0;
  149.                                 if(*taller)
  150.                                 {
  151.                                         switch((*T)->BF)
  152.                                         {
  153.                                                 case LH:
  154.                                                         *T=leftbalance(T);
  155.                                                         *taller=false;
  156.                                                         break;
  157.                                                 case EH:
  158.                                                         (*T)->BF=LH;
  159.                                                         *taller=true;
  160.                                                         break;
  161.                                                 case RH:
  162.                                                         (*T)->BF=EH;
  163.                                                         *taller=false;
  164.                                                         break;
  165.                                         }
  166.                                 }
  167.                                 break;
  168.                         case 1:
  169.                                 if(!InsertAVL(&((*T)->rchild),e,taller))
  170.                                         return 0;
  171.                                 if(*taller)
  172.                                 {
  173.                                         switch((*T)->BF)
  174.                                         {
  175.                                                 case LH:
  176.                                                         (*T)->BF=EH;
  177.                                                         *taller=false;
  178.                                                         break;
  179.                                                 case EH:
  180.                                                         (*T)->BF=RH;
  181.                                                         *taller=true;
  182.                                                         break;
  183.                                                 case RH:
  184.                                                         *T=rightbalance(T);
  185.                                                         *taller=false;
  186.                                                         break;
  187.                                         }
  188.                                 }
  189.                                 break;
  190.                                
  191.                 }
  192.         }
  193.         return 1;
  194. }
  195. int CalAveLength(BSTNode *rt,int *s,int *j,int i)
  196. {
  197.         if(rt)
  198.         {
  199.                 i++;
  200.                 *s=*s+i;
  201.                 if(CalAveLength(rt->rchild,s,j,i))
  202.                 {
  203.                         i--;
  204.                         return i;
  205.                 }
  206.         }
  207.         else
  208.                 return 1;
  209. }
  210. bool Find(BSTree T,int key)
  211. {
  212.         if(!T)
  213.                 return false;
  214.         else if(T->key==key)
  215.                 return true;
  216.         else if(T->key<key)
  217.                 return Find(T->rchild,key);
  218.         else
  219.                 return Find(T->lchild,key);
  220. }
  221. void Output(BSTree T)
  222. {
  223.         if(T)
  224.         {
  225.                  printf("%d",T->key);
  226.                  if(T->lchild||T->rchild)
  227.                 {
  228.                         printf("(");
  229.                            Output(T->lchild);
  230.                            printf(",");
  231.                            Output(T->rchild);
  232.                            printf(")");
  233.                   }
  234.         }
  235. }
  236. int main(int argc,char *argv[])
  237. {
  238.         int i;
  239.         int A[]={3,2,1,4,5,6,7,10,9,8};

  240.         //int A[]={3,2,1};
  241.         BSTree T=NULL;
  242.         bool taller;
  243.         for(i=0;i<sizeof(A)/sizeof(int);i++)
  244.                 InsertAVL(&T,A[i],&taller);
  245.         Output(T);
  246.         printf("\n");
  247.         if(Find(T,6))
  248.                 printf("6 is find in the AVL tree!\n");
  249.         else
  250.                 printf("6 is not find in the AVL tree!\n");
  251.         int len,j=0,s=0;
  252.         len=CalAveLength(T,&s,&j,i);
  253.         printf("二叉排序树查找成功的平均查找长度为:%d",len);
  254.         return 0;
  255. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-10 09:48:27 | 显示全部楼层
报什么错?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-19 14:04:43 | 显示全部楼层

编译成功,然而运行不能正确的显示平衡二叉树
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-9 01:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表