排序二叉树程序.docx

上传人:b****6 文档编号:7094899 上传时间:2023-01-17 格式:DOCX 页数:16 大小:16.40KB
下载 相关 举报
排序二叉树程序.docx_第1页
第1页 / 共16页
排序二叉树程序.docx_第2页
第2页 / 共16页
排序二叉树程序.docx_第3页
第3页 / 共16页
排序二叉树程序.docx_第4页
第4页 / 共16页
排序二叉树程序.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

排序二叉树程序.docx

《排序二叉树程序.docx》由会员分享,可在线阅读,更多相关《排序二叉树程序.docx(16页珍藏版)》请在冰豆网上搜索。

排序二叉树程序.docx

排序二叉树程序

#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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1