| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 527 人关注过本帖
标题:程序能运行,但是建的平衡二叉树不正确,不知道什么问题
只看楼主 加入收藏
koujia
Rank: 1
等 级:新手上路
帖 子:12
专家分:4
注 册:2013-10-22
结帖率:80%
收藏
 问题点数:0 回复次数:0 
程序能运行,但是建的平衡二叉树不正确,不知道什么问题
下面红色的程序部分可能有问题吧,如果用注释掉的那段程序就能显示完整二叉树,但不是平衡二叉树,不用的话,在输入关键字序列的时候都不能形成完整的树,麻烦帮忙改一下,好急的,谢谢!
#include <stdio.h>
#include <malloc.h>
#define EQ(a,b)   ((a)==(b))
#define LT(a,b)   ((a)<(b))
#define LQ(a,b)   ((a)>(b))
#define LH +1   //左高
#define EH  0   //等高
#define RH -1   //右高
typedef struct BTNode
{
   int data;
   int bf;                       //平衡因子
   struct  BTNode *lchild,*rchild;  //左右孩子
}BTNode,*BTree;


/*需要的函数声明*/
void PreOrder(BTree T);
void InOrder(BTree T);
void Right_Balance(BTree &p);
void Left_Balance(BTree &p);
void Left_Root_Balance(BTree &T);
void Right_Root_Balance(BTree &T);
bool InsertAVL(BTree &T,int i,bool &taller);
void PrintBT(BTree T,int m);
void CreatBT(BTree &T);

/*主函数*/
void main()
{
   int input,search,m;
   bool taller=false;
   int shorter=0;
   BTree T;
   T=(BTree)malloc(sizeof(BTNode));
   T=NULL;
   while(1)
   {
     printf("\n请选择需要的二叉树操作:1.创建二叉树 0.退出\n");
     scanf("%d",&input);
     getchar();
     switch(input)
     {
     case 1:
       CreatBT(T);
       break;
   
     case 0:
        break;
     default:
        printf("输入错误,请重新选择。");
        break;
     }
     if(input==0)
        break;
     printf("按任意键和回车继续:");
     getchar();
   }
}

/*先序遍历二叉树*/
void PreOrder(BTree T)
{                          //递归先序遍历二叉树
 if(!T)
    return;
 else
 {
  printf("%d ",T->data);   //根结点
  PreOrder(T->lchild);         //左子树
  PreOrder(T->rchild);         //右子树
 }
}
/*中序遍历二叉树*/
void  InOrder(BTree T)
{
    if(T)       //如果二叉树非空
    {
        InOrder(T->lchild);
        printf("%d ",T->data);  //访问节点
        InOrder(T->rchild);
    }
}                     
/*创建二叉树,以输入-1为建立的结束*/
void CreatBT(BTree &T)
{
  int m;
  int i;
  bool taller=false;
  T=NULL;
  printf("\n数列由以下关键字组成:\n");
  printf("\n请输入关键字(以-1结束建立二叉树):");
  scanf("%d",&i);
  getchar();
  while(i!=-1)
   {
    InsertAVL(T,i,taller);
     printf("\n请输入关键字(以-1结束建立二叉树):");
     scanf("%d",&i);
     getchar();
     taller=false;
   }
   m=0;
   printf("您创建的二叉树为:\n");
   PrintBT(T,m);
   printf("先序遍历为:");
   PreOrder(T);
   printf("\n中序遍历为:");
   InOrder(T);
   printf("\n\n");
}

/*插入节点i,若T中存在和i相同关键字的节点,则插入一个数据元素为i的新节点,并返回1,否则返回0*/
bool InsertAVL(BTree &T,int i,bool &taller)
{
   if(!T)    //插入新节点,树“长高”,置taller为true
   {
     T=(BTree)malloc(sizeof(BTNode));
     T->data=i;
     T->lchild=T->rchild=NULL;
      T->bf=EH;
      taller=true;
   }
   else
   {
     if(EQ(i,T->data))               //树中已存在和有相同关键字的节点
      {
         taller=false;
         printf("已存在相同关键字的节点\n");
         return 0;
      }
      if(LT(i,T->data))                //应继续在*T的左子树中进行搜索
      {
         if(!InsertAVL(T->lchild,i,taller))
             return 0;
         if(taller)
             switch(T->bf){
               case LH:
                   Left_Root_Balance(T);
                   taller=false;
                   break;
               case EH:
                   T->bf=LH;
                   taller=true;
                   break;
               case RH:
                   T->bf=EH;
                   taller=false;
                   break;

         }
         else{
             if(!InsertAVL(T->rchild,i,taller))
                 return 0;
             if(taller)
                 switch(T->bf){
                   case LH:
                       T->bf=EH;
                       taller=false;
                       break;
                   case EH:
                        T->bf=RH;
                        taller=true;
                        break;
                    case RH:
                        Right_Root_Balance(T);
                        taller=false;
                        break;
             }
         }
      }
     /*else
       {
         if(!InsertAVL(T->rchild,i,taller))
              return 0;
       }*/

   }
   return  1;
}
/*按树状打印输出二叉树的元素,m表示节点所在层次*/
void PrintBT(BTree T,int m)
{
   if(T)
   {
      int  i;
      if(T->rchild)
         PrintBT(T->rchild,m+1);
      for(i=1;i<=m;i++)
         printf("  ");  //打印出i个空格以表示出层次
       printf("%d\n",T->data);//打印T元素,换行
      if(T->lchild)
           PrintBT(T->lchild,m+1);
   }
   else
    {
       printf("这是一棵空树!\n");
       getchar();
    }
}

/*对以*p为根的二叉排序珊瑚作右旋处理*/
void Right_Balance(BTree &p)
{
   BTree  lc;
   lc=p->lchild;             //lc指向的*p左子树根节点
   p->lchild=lc->rchild;       //rc的右子树挂接为*p的左子树
   lc->rchild=p;
   p=lc;                //p指向新的节点
}
/*对以*p为根的二叉排序树作左旋处理*/
void Left_Balance(BTree &p)
{
   BTree  rc;
   rc=p->rchild;         //指向*p的右子树根节点
   p->rchild=rc->lchild;   //rc左子树挂接到*p的右子树
   rc->lchild=p;
   p=rc;                //p指向新节点
}
/*对以指针T所指节点为根的二叉树作左平衡旋转处理*/
void Left_Root_Balance(BTree  &T)
{
   BTree  lc,rd;
   lc=T->lchild;        //指向T的左子树根节点
   switch(lc->bf)       //检查*T的左子树的平衡度并作相应处理
   {
   case  LH:       //新节点插入在*T的左孩子的左子树上,要作单右旋处理
         T->bf=lc->bf=EH;
         Right_Balance(T);
         break;
    case  RH:          //新节点插入在*T的左孩子的右子树上,要作双旋处理
         rd=lc->rchild;   //rd指向*T的左孩子的右子树根
         switch(rd->bf)   //修改*T及其左孩子的平衡因子
         {
            case  LH:
                  T->bf=RH;
                  lc->bf=EH;
                  break;
             case  EH:
                  T->bf=lc->bf=EH;
                  break;
             case  RH:
                   T->bf=EH;
                   lc->bf=LH;
                   break;
         }
         rd->bf=EH;
         Left_Balance(T->lchild);     //对*T的左子树作左旋平衡处理
         Right_Balance(T);          //对*T作右旋处理
   }
}
/*对以指针T所指节点为根的二叉树作右平衡旋转处理*/
void Right_Root_Balance(BTree  &T)
{
   BTree  rc,ld;
   rc=T->rchild;        //指向T的左子树根节点
   switch(rc->bf)       //检查*T的左子树的平衡度并作相应处理
   {
   case  RH:      //新节点插入在*T的左孩子的右子树上,要作单左旋处理
         T->bf=rc->bf=EH;
         Left_Balance(T);
         break;
    case  LH:          //新节点插入在*T的左孩子的右子树上,要作双旋处理
         ld=rc->lchild;   //ld指向*T的右孩子的左子树根
         switch(ld->bf)   //修改*T及其右孩子的平衡因子
         {
            case  LH:
                  T->bf=EH;
                  rc->bf=RH;
                  break;
             case  EH:
                  T->bf=rc->bf=EH;
                  break;
             case  RH:
                   T->bf=LH;
                   rc->bf=EH;
                   break;
         }
         ld->bf=EH;
         Right_Balance(T->rchild);     //对*T的右子树作左旋平衡处理
         Left_Balance(T);          //对*T作左旋处理
   }
}

搜索更多相关主题的帖子: 输入关键字 include 二叉树 平衡 
2013-10-30 10:36
快速回复:程序能运行,但是建的平衡二叉树不正确,不知道什么问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021974 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved