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");
}
非常急!!请各位大哥大姐帮帮忙