排序二叉树程序.docx
《排序二叉树程序.docx》由会员分享,可在线阅读,更多相关《排序二叉树程序.docx(16页珍藏版)》请在冰豆网上搜索。
![排序二叉树程序.docx](https://file1.bdocx.com/fileroot1/2023-1/14/a7e3a9e7-8b98-4212-8640-3cc1b24eb70e/a7e3a9e7-8b98-4212-8640-3cc1b24eb70e1.gif)
排序二叉树程序
#include
#include
#defineMax100
typedefstructBitree
{
intdata;
intrag;
intlflag,rflag,flag;
structBitree*lchild,*rchild,*prio;
structBitree*next;
}list,*Tr;
Trt,top,shuzu[Max];
intj;
/*※※※※※※※※※进栈函数定义※※※※※※※※※※*/
Trjinzhan(Trr)
{
Trs;
s=(Tr)malloc(sizeof(list));
s=r;
s->next=top;
top=s;
returntop;
}
/*※※※※※※※※※出栈函数定义※※※※※※※※※※*/
Trchuzhan()
{
if(top==t)
top->next=NULL;
top=top->next;
returntop;
}
/*※※※※※※※※※排序二叉树插入函数定义※※※※※※※※※※*/
TrInsert(intx)
{
Trp,q;
staticTrhead;
inti=0;
q=(Tr)malloc(sizeof(list));
q->data=x;
q->rag=j;
q->lchild=q->rchild=q->prio=NULL;
q->lflag=q->rflag=q->flag=0;
if(t==NULL)
{
t=q;
jinzhan(t);
shuzu[j]=q;
j++;
}
else
{
p=t;
while(i==0)
{
if(p->data>x)
{
if(p->lchild!
=NULL)
p=p->lchild;
else
{
p->lchild=q;
q->prio=p;
i=1;
shuzu[j]=q;
j++;
jinzhan(q);
}
}
else
{
if(p->rchild!
=NULL)
p=p->rchild;
else
{
p->rchild=q;
q->prio=p;
i=1;
shuzu[j]=q;
j++;
jinzhan(q);
}
}
}
}
if(j==2)
head=t;
returnhead;
}
/*※※※※※※※※※排序二叉树函数定义※※※※※※※※※※*/
TrCreatTree()
{
Tra,head;
intx;
inti=0;
while
(1)
{
scanf("%d",&x);
if(x!
=-1)
head=Insert(x);
else
break;
}
returnhead;
}
/*※※※※※※※※※排序二叉树结点平衡因子函数定义※※※※※※※※※※*/
voidphyz()
{
voidjisuan(Trs);
Trs;
s=top;
while(s!
=NULL)
{
jisuan(s);
s=chuzhan();
}
}
/*※※※※※※※※※平衡因子计算函数定义※※※※※※※※※※*/
voidjisuan(Trs)
{
if(s)
{
if(s->lchild!
=NULL)
{
if(top->data>s->lchild->data)
top->lflag++;
else
top->rflag++;
}
jisuan(s->lchild);
if(s->rchild!
=NULL)
{
if(top->data>s->rchild->data)
top->lflag++;
else
top->rflag++;
}
jisuan(s->rchild);
top->flag=top->lflag-top->rflag;
}
}
/*※※※※※※※※※排序二叉树输出函数定义※※※※※※※※※※*/
voidprint(Trhead)
{
FILE*p;
p=fopen("wendang.txt","a+");
if(p==NULL)
{
printf("Can'topenanunexitingtxt\n");
exit(0);
}
if(head!
=NULL)
{
print(head->lchild);
printf("%3d排号[%2d]平衡因子[%2d]\n",head->data,head->rag,head->flag);
fprintf(p,"%3d排号[%2d]平衡因子[%2d]\n",head->data,head->rag,head->flag);
fclose(p);
print(head->rchild);
}
}
/*※※※※※※※※※查找排序二叉树函数定义※※※※※※※※※※*/
voidchazhao(inti)
{
FILE*p;
p=fopen("wendang.txt","a+");
if(p==NULL)
{
printf("Can'topenanunexitingtxt\n");
exit(0);
}
printf("您要查找的结点是:
%3d平衡因子[%2d]\n",shuzu[i]->data,shuzu[i]->flag);
fprintf(p,"\n\n您要查找的结点是:
%3d平衡因子[%2d]\n",shuzu[i]->data,shuzu[i]->flag);
if(shuzu[i]->prio!
=NULL)
{
printf("此节点的直接前驱是:
%3d\n",shuzu[i]->prio->data);
fprintf(p,"此节点的直接前驱是:
%3d\n",shuzu[i]->prio->data);
}
else
{
printf("此节点无直接前驱\n");
fprintf(p,"此节点无直接前驱\n");
}
if(shuzu[i]->lchild!
=NULL)
{
printf("此节点的左孩子是:
%3d\n",shuzu[i]->lchild->data);
fprintf(p,"此节点的左孩子是:
%3d\n",shuzu[i]->lchild->data);
}
else
{
printf("此节点无左孩子\n");
fprintf(p,"此节点无左孩子\n");
}
if(shuzu[i]->rchild!
=NULL)
{
printf("此节点的右孩子是:
%3d\n",shuzu[i]->rchild->data);
fprintf(p,"此节点的右孩子是:
%3d\n",shuzu[i]->rchild->data);
}
else
{
printf("此节点无右孩子\n");
fprintf(p,"此节点无右孩子\n");
}
fclose(p);
}
/*※※※※※※※※※查找排序二叉树平衡因子函数定义※※※※※※※※※※*/
voidchaphyz(inti)
{
FILE*p;
p=fopen("wendang.txt","a+");
if(p==NULL)
{
printf("Can'topenanunexitingtxt\n");
exit(0);
}
printf("您要查找的结点是:
%3d平衡因子[%3d]\n",shuzu[i]->data,shuzu[i]->flag);
fprintf(p,"\n\n您要查找的结点是:
%3d平衡因子[%3d]\n",shuzu[i]->data,shuzu[i]->flag);
fclose(p);
}
/*※※※※※※※※※删除排序二叉树函数定义※※※※※※※※※※*/
Trshanchu(inti)
{
Tra,s;
if(i!
=1)
{
a=shuzu[i];
if(a->lchild==NULL&&a->rchild==NULL)
{
if(a->prio->lchild==a)
a->prio->lchild=NULL;
elseif(a->prio->rchild==a)
a->prio->rchild=NULL;
free(a);
}
elseif(a->prio->lchild==a)
{
if(a->lchild!
=NULL)
{
a->prio->lchild=a->lchild;
a->lchild->prio=a->prio;
s=a->lchild;
while
(1)
{
if(s->rchild!
=NULL)
s=s->rchild;
else
{
s->rchild=a->rchild;
a->rchild->prio=s;
break;
}
}
}
else
{
a->prio->lchild=a->rchild;
a->rchild->prio=a->prio;
}
free(a);
}
elseif(a->prio->rchild==a)
{
if(a->rchild!
=NULL)
{
a->prio->rchild=a->rchild;
a->rchild->prio=a->prio;
s=a->rchild;
while
(1)
{
if(s->lchild!
=NULL)
s=s->lchild;
else
{
s->lchild=a->lchild;
a->lchild->prio=s;
break;
}
}
}
else
{
a->prio->rchild=a->lchild;
a->lchild->prio=a->prio;
}
free(a);
}
}
else
{
a=shuzu[i];
if(a->lchild!
=NULL)
{
a->lchild->prio=NULL;
s=a->lchild;
while
(1)
{
if(s->rchild!
=NULL)
s=s->rchild;
else
{
s->rchild=a->rchild;
a->rchild->prio=s;
break;
}
}
free(a);
returna->lchild;
}
else
{
a->rchild->prio=NULL;
free(a);
returna->rchild;
}
}
returnt;
}
/*※※※※※※※※※重新计算二叉树平衡因子函数定义※※※※※※※※※※*/
voidchongpai(Tra)
{
if(a!
=NULL)
{
jinzhan(a);
a->lflag=a->rflag=a->flag=0;
}
if(a)
{
chongpai(a->lchild);
chongpai(a->rchild);
}
Trs;
s=top;
while(s!
=NULL)
{
jisuan(s);
s=chuzhan();
}
}
/*※※※※※※※※※主函数定义※※※※※※※※※※*/
intmain()
{
FILE*p;
Tra;
inti;
printf("※※※※※※※此程序包含排序二叉树的查找,遍历,删除,添加等功能※※※※※※※※\n");
printf("注:
当尝试运用删除操作时,若删除的是根节点,则按后序接尾法,输入的是关键字序列\n\n");
printf("欢迎使用\n\n");
printf("1、排序二叉树查找\n");
printf("2、排序二叉树遍历(中序)\n");
printf("3、排序二叉树删除结点\n");
printf("4、排序二叉树添加结点\n");
printf("5、排序二叉树结点平衡因子\n");
printf("6、退出\n\n");
t=NULL;
j=1;
printf("※※※※※※※※※请输入您要建立的排序二叉树的序列,并以‘-1’结束※※※※※※※\n");
a=CreatTree();
phyz();
lee:
{
printf("请输入您要进行的操作\n");
scanf("%d",&i);
if(i==1)
{
printf("请输入您要查找结点的序号\n");
scanf("%d",&i);
if(i>j)
{
do
{
printf("您要查找的数排号不在二叉排序树中,请核实重新输入\n");
scanf("%d",&i);
}while(i>j);
}
chazhao(i);
gotolee;
}
if(i==2)
{
printf("中序遍历结果\n");
p=fopen("wendang.txt","a+");
if(p==NULL)
{
printf("Can'topenanunexitingtxt\n");
exit(0);
}
fprintf(p,"\n中序遍历为\n");
fclose(p);
print(a);
gotolee;
}
if(i==3)
{
printf("请输入您要删除第几个结点\n");
scanf("%d",&i);
if(i>j)
{
do
{
printf("您要查找的数排号不在二叉排序树中,请核实重新输入\n");
scanf("%d",&i);
}while(i>j);
}
a=shanchu(i);
chongpai(a);
printf("您删除元素后中序遍历为\n");
p=fopen("wendang.txt","a+");
if(p==NULL)
{
printf("Can'topenanunexitingtxt\n");
exit(0);
}
fprintf(p,"\n\n您删除元素后中序遍历为\n");
fclose(p);
print(a);
gotolee;
}
if(i==4)
{
printf("请输入您要添加的元素\n");
scanf("%d",&i);
Insert(i);
chongpai(a);
printf("您添加元素后中序遍历为\n");
p=fopen("wendang.txt","a+");
if(p==NULL)
{
printf("Can'topenanunexitingtxt\n");
exit(0);
}
fprintf(p,"\n\n您添加元素后中序遍历为\n");
fclose(p);
print(a);
gotolee;
}if(i==5)
{
printf("请输入您要计算的结点平衡因子序号\n");
scanf("%d",&i);
if(i>j)
{
do
{
printf("您要查找的数排号不在二叉排序树中,请核实重新输入\n");
scanf("%d",&i);
}while(i>j);
}
chaphyz(i);
gotolee;
}
if(i==6)
{
printf("****\n");
printf("****\n");
printf("*★*★*\n");
printf("*★*\n");
printf(">>>-----*Thanks!
*------>\n");
printf("*for*\n");
printf("*usage*\n");
printf("*★*\n");
printf("**\n");
printf("**\n");
printf("**\n");
printf("*\n");
}
}
return0;
}
//测试数据
//1015205103097-1
//532577620483014609841015205-1