C++中平衡二叉树的问题。调试了好几天还是找不出来。急 急急!!!

Groth 2009-06-08 05:50:53
运行程序中依次插入70 60 75 73 80 72 后输出的先序遍历和中序遍历有错误。。。
程序是:#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
#define NULL 0


typedef struct BSTNode
{
int data;
int bf;
struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;


void R_Rotate(BSTree &p);
void L_Rotate(BSTree &p);
void LeftBalance(BSTree &T);
void RightBalance(BSTree &T);
bool InsertAVL(BSTree &T,int e,bool &taller);
void CreatBST(BSTree &T);


void main()
{
bool taller=false;
BSTree T;
while(1)
{
printf("请输入一些整数组成二叉树:\t");
CreatBST(T);
}


}

void PrintMID(BSTree T)
{

if(T->lchild)
PrintMID(T->lchild);
printf("%6d",T->data);
if(T->rchild)
PrintMID(T->rchild);
}

void printpre(BSTree T)

{
printf("%6d",T->data);

if(T->lchild)
PrintMID(T->lchild);
if(T->rchild)
PrintMID(T->rchild);
}

void R_Rotate(BSTree &p)
{
BSTree lc;
lc = p->lchild;
p->lchild = lc->rchild;
lc->rchild = p; p = lc;
}

void L_Rotate(BSTree &p)
{
BSTree rc;
rc = p->rchild;
p->rchild = rc->lchild;
rc->lchild = p; p = rc;
}

void LeftBalance(BSTree &T)
{
BSTree lc,rd;
lc = T->lchild;
switch(lc->bf)
{
case LH:
T->bf = lc->bf = EH;
R_Rotate(T);
printf("二叉树不平衡,做单向右旋处理\n");
printf("平衡二叉树的中序输出:");
PrintMID(T);
printf("\n平衡二叉树的先序输出:");
printpre(T);

break;
case RH:
rd = lc->rchild;
switch(rd->bf)
{
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;
L_Rotate(T->lchild);
R_Rotate(T);
printf("二叉树不平衡,做先左旋后右旋处理\n");
printf("平衡二叉树的中序输出:");
PrintMID(T);
printf("\n平衡二叉树的先序输出:");
printpre(T);
}
}

void RightBalance(BSTree &T)
{
BSTree rc,ld;
rc = T->rchild;
switch(rc->bf)
{
case RH:
T->bf = rc->bf =EH;
L_Rotate(T);
printf("二叉树不平衡,做单向左旋处理\n");
printf("平衡二叉树的中序输出:");
PrintMID(T);
printf("\n平衡二叉树的先序输出:");
printpre(T);
break;
case LH:
ld = rc->lchild;
switch(ld->bf)
{
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;
R_Rotate(T->rchild);
L_Rotate(T);
printf("二叉树不平衡,做先右旋后左旋处理\n");
printf("平衡二叉树的中序输出:");
PrintMID(T);
printf("\n平衡二叉树的先序输出:");
printpre(T);

}
}


bool InsertAVL(BSTree &T,int e,bool &taller)
{
if(!T)
{
T = (BSTree)malloc(sizeof(BSTNode));
T->data = e;
T->lchild = T->rchild =NULL;
T->bf = EH; taller = true;
}
else
{
if(EQ(e,T->data))
{ taller = false;printf("已存在相同关键字的结点\n"); return 0; }
if(LT(e,T->data))
{
if(!InsertAVL(T->lchild,e,taller)) return 0;
if(taller)
switch(T->bf)
{
case LH:
LeftBalance(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,e,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:
RightBalance(T);taller = false; break;
}
}
}
return 1;
}


void CreatBST(BSTree &T)
{
int e;
bool taller=false;
T = NULL;
printf("\n请输入关键字(以-1结束建立平衡二叉树):");
scanf("%d",&e);getchar();
while(e != -1)
{
InsertAVL(T,e,taller); //把e插入到T中
printf("\n请输入关键字(以-1结束建立平衡二叉树):");
scanf("%d",&e);getchar();taller=false;
};

printf("平衡二叉树创建结束.\n");
printf("平衡二叉树的中序输出:");
if(T)
PrintMID(T);
printf("\n平衡二叉树的先序输出:");
if(T)
printpre(T);
else printf("这是一棵空树.\n");
}




非常急!!请各位大哥大姐帮帮忙
...全文
85 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Groth 2009-06-10
  • 打赏
  • 举报
回复
自己顶下
Groth 2009-06-09
  • 打赏
  • 举报
回复
昨天又改了下还是不知道问题出在哪里
shexinwei 2009-06-08
  • 打赏
  • 举报
回复
帮顶!!
wbgxx 2009-06-08
  • 打赏
  • 举报
回复
好长啊!人人建议,用代码把他们贴出来.........
liliangbao 2009-06-08
  • 打赏
  • 举报
回复
帮顶!

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧