各位高手看看我这个红黑树的程序哪里出错了?

albert135 2012-05-13 01:26:30
按着算法导论编写的程序(还没写删除的例程),不知为何出错了,高手帮忙看一下
程序有点长,发到115网盘上了 http://115.com/file/benhgiq8
...全文
112 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
youkuxiaobin 2012-05-13
  • 打赏
  • 举报
回复
还得看下数据结构,毕业找完工作就忘光了
albert135 2012-05-13
  • 打赏
  • 举报
回复
代码在这里
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define RED 0
#define BLACK 1
struct TreeNode;
typedef int ElemenType;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;
SearchTree MakeEmpty(SearchTree T);
Position Find(ElemenType x,SearchTree T);
Position FindMin(SearchTree T);
Position FindMax(SearchTree T);
SearchTree LeftRotate(SearchTree X,SearchTree T);
SearchTree RightRotate(SearchTree X,SearchTree T);
SearchTree Insert(ElemenType z,SearchTree T);
SearchTree InsertFixUp(SearchTree T,Position Z);
SearchTree Delete(ElemenType x,SearchTree T);
ElemenType Retrieve(Position P);
struct TreeNode
{
ElemenType Element;
int Color;
SearchTree Left;
SearchTree Right;
SearchTree Parent;
};
SearchTree NIL;
SearchTree MakeEmpty(SearchTree T)
{
if(T!=NULL)
{
MakeEmpty(T->Left);
MakeEmpty(T->Right);
free(T);
}
return NULL;
}
Position Find(ElemenType x,SearchTree T)
{
if(T==NULL)
return NULL;
if(x<T->Element)
return Find(x,T->Left);
else
{
if(x>T->Element)
return Find(x,T->Right);
else
return T;
}
}
Position FindMin(SearchTree T)
{
if(T==NULL)
return NULL;
else
{
while(1)
{
if(T->Left==NULL)
return T;
else
T=T->Left;
}
}
}
Position FindMax(SearchTree T)
{
if(T==NULL)
return NULL;
else
{
while(1)
{
if(T->Right==NULL)
return T;
else
T=T->Right;
}
}
}
SearchTree LeftRotate(SearchTree X,SearchTree T)
{
SearchTree Y;
Y=X->Right;
X->Right=Y->Left;
if(Y->Left!=NIL)
{
Y->Left->Parent=X;
}
Y->Parent=X->Parent;
if(X->Parent==NIL)
{
T=Y;
}
else
{
if(X==X->Parent->Left)
{
X->Parent->Left=Y;
}
else
{
X->Parent->Right=Y;
}
}
Y->Left=X;
X->Parent=Y;
return T;
}
SearchTree RightRotate(SearchTree X,SearchTree T)
{
SearchTree Y;
Y=X->Left;
X->Left=Y->Right;
if(Y->Right!=NIL)
{
Y->Right->Parent=X;
}
Y->Parent=X->Parent;
if(X->Parent==NIL)
{
T=Y;
}
else
{
if(X==X->Parent->Right)
{
X->Parent->Right=Y;
}
else
{
X->Parent->Left=Y;
}
}
Y->Right=X;
X->Parent=Y;
return T;
}
SearchTree InsertFixUp(SearchTree T,Position Z)
{
Position Y;
while(Z->Parent->Color==RED)
{
if(Z->Parent==Z->Parent->Parent->Left)
{
Y=Z->Parent->Parent->Right;
if(Y->Color==RED)
{
Z->Parent->Color=BLACK;
Y->Color=BLACK;
Z->Parent->Parent->Color=RED;
Z=Z->Parent->Parent;
}
else
{
if(Z==Z->Parent->Right)
{
Z=Z->Parent;
T=LeftRotate(T,Z);
}
Z->Parent->Color=BLACK;
Z->Parent->Parent->Color=RED;
T=RightRotate(T,Z->Parent->Parent);
}
}
else
{
Y=Z->Parent->Parent->Left;
if(Y->Color==RED)
{
Z->Parent->Color=BLACK;
Y->Color=BLACK;
Z->Parent->Parent->Color=RED;
Z=Z->Parent->Parent;
}
else
{
if(Z==Z->Parent->Left)
{
Z=Z->Parent;
T=RightRotate(T,Z);
}
Z->Parent->Color=BLACK;
Z->Parent->Parent->Color=RED;
T=LeftRotate(T,Z->Parent->Parent);
}
}
}
return T;
}
SearchTree Insert(ElemenType z1,SearchTree T)
{
Position X,Y,Z;
Z=(Position)malloc(sizeof(struct TreeNode)); //repeated data can be inserted
if(Z==NULL)
{
printf("ERROR!Out of space\n");
return 0;
}
Z->Element=z1;
Y=NIL;
X=T;
while(X!=NIL)
{
Y=X;
if(Z->Element<X->Element)
X=X->Left;
else
X=X->Right;
}
Z->Parent=Y;
if(Y==NIL)
{
T=Z;
}
else
{
if(Z->Element<Y->Element)
Y->Left=Z;
else
Y->Right=Z;
}
Z->Left=NIL;
Z->Right=NIL;
Z->Color=RED;
T=InsertFixUp(T,Z);
return T;
}
void PrintTree(SearchTree T)
{
if(T!=NULL)
{
PrintTree(T->Left);
printf("%d ",T->Element);
PrintTree(T->Right);
}
}
int main()
{
int i;
SearchTree T;
NIL=(Position)malloc(sizeof(struct TreeNode));
T=NIL;
NIL->Color=BLACK;
srand((int)time(NULL));
for(i=0;i<100;i++)
{
T=Insert(rand(),T);
}
PrintTree(T);
return 0;
}
peng_weida 2012-05-13
  • 打赏
  • 举报
回复
我晕~ 帖到这儿嘛
W170532934 2012-05-13
  • 打赏
  • 举报
回复
我勒个去,还要转地方

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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