红⿊树源代码CC++,有注释,操作齐全,⾃⼰写的
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<stdbool.h>
typedef struct RBTNode
{
int data;
int color;//1代表红⾊,0代表⿊⾊
struct RBTNode* left;
struct RBTNode* right;
struct RBTNode* parent;
} RBT,*PRBT;
void In_traver(PRBT RBTtree);//中序遍历英语沙龙下载
void post_traver(PRBT RBTtree);//后序遍历
void pre_traver(PRBT RBTtree);//先序遍历
PRBT get_max(PRBT RBTtree);//得到最⼤节点
PRBT get_min(PRBT RBTtree);//得到最⼩节点
PRBT get_pre(PRBT RBTtree);//得到前驱节点
PRBT get_post(PRBT RBTtree);//得到后继节点
int get_depth(PRBT RBTtree);//得到树深度
int max(int a,int b);//得到两个数之间的最⼤值
PRBT arch_value_1(PRBT RBTtree,int value);//⾮递归查找
PRBT arch_value_2(PRBT RBTtree,int value);//递归查找
bool arch_value_3(PRBT RBTtree,PRBT parent,PRBT& P,int value);//查找,如果成功返回该节点,否则返回其查找路径上最后⼀个结点
bool inrt_Node(PRBT& RBTtree,int value);//插⼊
void inrt_fixup(PRBT& RBTtree,PRBT RBTnew);//插⼊调整使其满⾜红⿊树性质4和5
void left_rotate(PRBT& RBTtree,PRBT RBTNode);//左旋
void right_rotate(PRBT& RBTtree,PRBT RBTNode);//右旋
PRBT creat_RBT(int*arr,int len);//创建⼀颗红⿊树
void print_RBT(PRBT RBTtree,int direction);//打印红⿊树
PRBT Destroy_RBT(PRBT RBTtree);//销毁红⿊树
bool Delete_Node(PRBT& RBTtree,int value);//删除外部接⼝
void Delete(PRBT& RBTtree,PRBT RBTNode);//删除内部接⼝
void delete_fixup(PRBT& RBTtree,PRBT Child,PRBT Parent);//删除调整使其满⾜红⿊树性质4和5
int main()
{
printf(“\n");
printf(" 1.创建红⿊树 \n");
printf(" 2.打印红⿊树 \n");
printf(" 3.遍历红⿊树 \n");
printf(" 4.销毁红⿊树 \n");color
printf(" 5.查询红⿊树 \n");
printf(" 6.打印红⿊树最⼤值 \n");
printf(" 7.打印红⿊树最⼩值 \n");
printf(" 8.查找节点前驱节点 \n");
printf(" 9.查找节点后继节点 \n");
printf(" 10.查找红⿊树深度 \n");
printf(" 11.插⼊红⿊树节点 \n");
printf(" 11.插⼊红⿊树节点 \n");
printf(" 12.删除红⿊树节点 \n");
printf("\n”);
char ch;
PRBT RBTtree=NULL;
PRBT Temp=NULL;
int* arr;
int value,num,i;
do
{
printf(“请输⼊您想要执⾏的操作:”);
scanf("%d",&num);
if(num>0&&num<13)
{
switch(num)fast
{
ca 1:
printf(“请输⼊你想要创建节点的个数:”);
scanf("%d",&value);
arr=(int*)malloc(sizeof(int)*value);
printf(“请为节点赋值(不可相同,中间以空格隔开):”);
for(i=0; i<value; i++)
scanf("%d",arr+i);
RBTtree=creat_RBT(arr,value);
printf(“红⿊树创建已完成\n”);
break;
ca 2:
printf(“打印红⿊树为:\n”);
print_RBT(RBTtree,0);
break;
ca 3:
printf(“前序遍历为:”);
pre_traver(RBTtree);
printf("\n");
printf(“中序遍历为:”);
In_traver(RBTtree);
printf("\n");
printf(“后序遍历为:”);
post_traver(RBTtree);
printf("\n");
break;
ca 4:
RBTtree=Destroy_RBT(RBTtree);
printf(“红⿊树已销毁\n”);
break;
ca 5:
printf(“请输⼊你想要查询的值:”);
scanf("%d",&value);
if((Temp=arch_value_1(RBTtree,value)))
{
printf(“查找成功\n”);
if(Temp->parent)
printf("%d(%c) is %d’s %s Child.\n",Temp->data,Temp->color1?‘R’:‘B’,Temp->parent->data,Temp->dataparent->data?“Left”:“Right”);
英翻译汉el
printf("%d(%c) is root.\n",Temp->data,Temp->color1?‘R’:‘B’);
printf("%d(%c) is root.\n",Temp->data,Temp->color1?‘R’:‘B’);
}
el
printf(“查找失败\n”);
break;
ca 6:
printf(“红⿊树最⼤值为%d\n”,get_max(RBTtree)->data);
break;
ca 7:
printf(“红⿊树最⼩值为%d\n”,get_min(RBTtree)->data);
break;
ca 8:
printf(“请输⼊您想要查询的节点:”);
scanf("%d",&value);
if(get_pre(arch_value_1(RBTtree,value)))
printf(“该结点的前驱节点为%d\n”,get_pre(arch_value_1(RBTtree,value))->data); el
printf(“该结点没有前驱节点\n”);
break;
ca 9:
printf(“请输⼊您想要查询的节点:”);
scanf("%d",&value);somic
if(get_post(arch_value_1(RBTtree,value)))
printf(“该结点的后继节点为%d\n”,get_post(arch_value_1(RBTtree,value))->data); el
printf(“该结点没有后继节点\n”);
没关系韩语break;
ca 10:
printf(“红⿊树的深度为%d\n”,get_depth(RBTtree));
break;
ca 11:
printf(“请输⼊你想要插⼊的值:”);
scanf("%d",&value);
if(inrt_Node(RBTtree,value))
{
printf(“插⼊成功\n”);
print_RBT(RBTtree,0);
}
el
printf(“插⼊失败\n”);
break;
ca 12:
printf(“请输⼊你想要删除的值:”);
scanf("%d",&value);
if(Delete_Node(RBTtree,value))
{
printf(“删除成功\n”);
print_RBT(RBTtree,0);
}
el
printf(“删除失败\n”);
break;
}
}
printf(“请问您是否还要执⾏操作(Y/N):”);
scanf(" %c",&ch);
scanf(" %c",&ch);
}
while(ch==‘Y’||ch==‘y’); return 0;
}
void In_traver(PRBT RBTtree)
{
if(RBTtree)
{
if(RBTtree->left)
In_traver(RBTtree->left);
printf("%d ",RBTtree->data);
if(RBTtree->right)
In_traver(RBTtree->right);
}
}
PRBT creat_RBT(int*arr,int len)
{
PRBT RBTtree=NULL;
for(int i=0; i<len; i++)
inrt_Node(RBTtree,arr[i]);
return RBTtree;
}
void post_traver(PRBT RBTtree) {
if(RBTtree)
{
if(RBTtree->left)
post_traver(RBTtree->left);
if(RBTtree->right)
天津教育培训机构
post_traver(RBTtree->right); printf("%d ",RBTtree->data);
}
加州大学圣地亚哥分校}
void pre_traver(PRBT RBTtree) {
if(RBTtree)
{
printf("%d ",RBTtree->data);
breakaway歌词
if(RBTtree->left)
pre_traver(RBTtree->left);
if(RBTtree->right)
pre_traver(RBTtree->right);
}
}
PRBT Destroy_RBT(PRBT RBTtree)
{
if(RBTtree)
{
if(RBTtree->left)
Destroy_RBT(RBTtree->left);
if(RBTtree->right)
Destroy_RBT(RBTtree->right);
free(RBTtree);
}
oceanic
return NULL;
}
PRBT arch_value_1(PRBT RBTtree,int value) {
PRBT P=RBTtree;
while(P&&(P->data!=value))
{
if(P->data<value)
P=P->right;
el
P=P->left;
}
return P;
}
PRBT arch_value_2(PRBT RBTtree,int value) {
if(RBTtree NULL||RBTtree->data value)
return RBTtree;
el
{
if(RBTtree->data<value)
return arch_value_2(RBTtree->right,value); el
return arch_value_2(RBTtree->left,value);
}
}