📄 btrechar.h
字号:
else{
y0=t->y+radiuy*7 / 10;
switch (lr){
case lt:
if (y0<y1) {
ellipse(x1-radiux / 2,y1,180,359,radiux / 2,radiuy / 2);
Arrow(x1-radiux,y1,t->x-radiux*7 / 10*(Sgn(x1,t->x)+1) / 2,t->y+radiuy);
}else
if (y0==y1) Arrow(x1-radiux*3 / 10,y1-radiuy*3 / 10,t->x+radiux,t->y);
else Arrow(x1,y1,t->x-radiux*7 / 10*Sgn(x1,t->x),t->y-radiuy);//*7 / 10;
break;
case r:
if (y0<y1) {
ellipse(x1+radiux / 2,y1,180,359,radiux / 2,radiuy / 2);
Arrow(x1+radiux,y1,t->x-radiux*7 / 10*(Sgn(x1,t->x)+1) / 2,t->y+radiuy);
}else
if (y0==y1) Arrow(x1,y1,t->x-radiux*7 / 10,t->y+radiuy*7 / 10);
else Arrow(x1,y1,t->x-radiux*7 / 10*Sgn(x1,t->x),t->y-radiuy);//*7 / 10
break;
}
}
setlinestyle(0,lpr.upattern,lpr.thickness);
setcolor(clr);
}
void rthread_point_to(bitre t1,bitre t2)
{
int xs,ys;
xs=t1->x+radiux*7 / 10;
ys=t1->y+radiux*7 / 10;
thread(1,t2,xs,ys);
}
void lthread_point_to(bitre t1,bitre t2)
{
int xs,ys;
xs=t1->x-radiux*7 / 10;
ys=t1->y+radiux*7 / 10;
thread(-1,t2,xs,ys);
}
void write_atbnode_angle(bitre t,int an,string ss)
{
int x1,y1,l;
float angle;
l=an / 360;
angle=an*2*PI/360;
x1=t->x+Round(radiux*(2+l)*cos(angle));
y1=t->y-Round(radiuy*(2+l)*sin(angle));
outtextxy(x1,y1,ss);
}
/* void writestr_atbnode_angle(bitre t,an:integer;string ss)
{ write_atbnode_angle(t,an,ss) }
void writeint_atbnode_angle(bitre t,an:integer;ii:integer)
var string ss;
{ str(ii,ss);write_atbnode_angle(t,an,ss) }
void dispstr_atbnode_angle(string ss, bitre t,an:integer)
{ write_atbnode_angle(t,an,ss) }
*/
void dispint_atbnode_angle(int ii,bitre t,int an)
{
string ss;
Convs(ii,ss);
write_atbnode_angle(t,an,ss);
}
void dis_btre1t(bitre tt,int x1,int y1)
{
if (tt!=NULL){
line(x1,y1,tt->x,tt->y-radiuy);
ellipse(tt->x,tt->y,0,359,radiux,radiuy);
outtextxy(tt->x,tt->y,conv(tt->data));
if (tt->ltag==1) thread(lt,tt->lchild,tt->x-xl,tt->y+yl);
else dis_btre1t(tt->lchild,tt->x-xl,tt->y+yl);
if (tt->rtag==1) thread(r,tt->rchild,tt->x+xl,tt->y+yl);
else dis_btre1t(tt->rchild,tt->x+xl,tt->y+yl);
}
}
void dis_thbitre(bitre tt)//string s;
{
if (tt!=NULL){
xl=radiux*7 / 10;
yl=radiuy*7 / 10;
ellipse(tt->x-20,tt->y-20,0,360,5,5);
dis_btre1t(tt,tt->x-20,tt->y-20);
}
getch();
getch();
}
boolean leaft(bitre p)
{
if ((p->ltag==1) && (p->rtag==1)) return true;
else return false;
}
void comput_btre_widthpt(bitre &tt)
{
if (tt!=NULL){
if (tt->ltag==0) comput_btre_widthpt(tt->lchild);
if (tt->rtag==0) comput_btre_widthpt(tt->rchild);
if ((tt->ltag==1) && (tt->rtag==1)){
tt->lw=0;
tt->rw=0;
}else
if (tt->ltag==1){
tt->lw=Max(0,tt->rchild->lw-1);
tt->rw=tt->rchild->rw+1;
}else
if (tt->rtag==1){
tt->rw=Max(0,tt->lchild->rw-1);
tt->lw=tt->lchild->lw+1;
}else
if (leaft(tt->lchild)){
tt->lw=Max(1,tt->rchild->lw-1);
tt->rw=tt->rchild->rw+1;
}else
if (leaft(tt->rchild)){
tt->rw=Max(1,tt->lchild->rw-1);
tt->lw=tt->lchild->lw+1;
}else{
tt->lw=tt->lchild->w;
tt->rw=tt->rchild->w;
}
tt->w=tt->lw+tt->rw+1;
}
}
void comput_btre_cardp0t(int tag,bitre &tt,int xt,int d)
{
if ((tt!=NULL) && (tag==0)){
d=d+1;
tt->y=d;
tt->x=xt;
if (tt->ltag==1) comput_btre_cardp0t(tt->rtag,tt->rchild,tt->x+1,d);
else
if (tt->rtag==1) comput_btre_cardp0t(tt->ltag,tt->lchild,tt->x-1,d);
else
if (leaft(tt->lchild) || leaft(tt->rchild)){
comput_btre_cardp0t(tt->ltag,tt->lchild,tt->x-1,d);
comput_btre_cardp0t(tt->rtag,tt->rchild,tt->x+1,d);
}else{
comput_btre_cardp0t(tt->ltag,tt->lchild,tt->x-1-tt->lchild->rw,d);
comput_btre_cardp0t(tt->rtag,tt->rchild,tt->x+1+tt->rchild->lw,d);
}
}
}
void comput_node_card1t(bitre &tt)
{
if (tt!=NULL){
tt->x=tt->x*step_col+strt_col;
tt->y=tt->y*step_row+strt_row;
if (tt->ltag==0) comput_node_card1t(tt->lchild);
if (tt->rtag==0) comput_node_card1t(tt->rchild);
}
}
void comput_thbtre_cardp(bitre &tt)
{
comput_btre_widthpt(tt);
comput_btre_cardp0t(0,tt,tt->lw,0);
gtmaxxy(mx,my);
if (tt->w*step_col-10<mx) strt_col=(mx-tt->w*step_col-10) / 2;
else step_col=mx / (tt->w+2);
hi=highth(tt);
if ((hi+1)*step_row-10<my) strt_row=(my-(hi+1)*step_row-10) / 2;
else step_row=my / (hi+3);
comput_node_card1t(tt) ;
}
void disp_thbitre(string s,bitre &tt)
{
int v1,v2,v3,v4;
if (tt==NULL){
rectangle(mx / 2-40,my / 2-40,mx / 2+40,my / 2+40);
outtextxy(mx / 2,my / 2-5,s);
ellipse(mx / 2,my / 2,0,359,radiux,radiuy);
line(mx / 2+10,my / 2-10,mx / 2-10,my / 2+10);
}else{
clear_bitre_range(tt);
bitre_range(tt,v1,v2,v3,v4);
v1=v1+8;
v2=v2+12;
v3=v3-8;
v4=v4-8;
rectangle(v1,v2,v3,v4);
outtextxy((v1+v3) / 2,v2-5,s);
dis_thbitre(tt);
}
}
void display_threaded_bitre(string s,bitre &tt)
{
initial_bitre();
comput_thbtre_cardp(tt);
disp_thbitre(s,tt);
getch();//End_graph();
}
void comput_thbitre_card(bitre &tt)
{
comput_thbtre_cardp(tt);
}
void in_thread1(bitre &t,bitre &pre)
{
if (t!=NULL){
if (t->lchild==NULL){
t->lchild=pre;
t->ltag=1;
}else{
in_thread1(t->lchild,pre);
pre->rchild=t;
}
pre=t;
if (t->rchild==NULL) t->rtag=1;
else in_thread1(t->rchild,pre);
}
}
void in_thread_bitre(bitre t,bitre &tt)
{
bitre pre;
copy_bitre(t,tt);
pre=NULL;
in_thread1(tt,pre);
display_threaded_bitre(" inorder threaded bitre",tt);
}
void post_thread1(bitre &t,bitre &pre)
{
if (t!=NULL){
post_thread1(t->lchild,pre);
if (t->rchild==NULL) t->rtag=1;
else post_thread1(t->rchild,pre);
if (t->lchild==NULL){
t->ltag=1;
t->lchild=pre;
}
if ((pre!=NULL) && (pre->rtag==1)) pre->rchild=t;
pre=t;
}
}
void post_thread_bitre(bitre t,bitre &tt)
{
bitre pre;
copy_bitre(t,tt);
pre=NULL;
post_thread1(tt,pre);
display_threaded_bitre(" postorder threaded bitre",tt);
}
void pre_thread1(bitre &tt,bitre &pre)
{
if ((pre!=NULL) && (pre->rtag==1) && (pre->rchild==NULL)) pre->rchild=tt;
if (tt!=NULL){
if (tt->lchild==NULL){
tt->ltag=1;
tt->lchild=pre;
pre=tt;
}else{
if (tt->rchild==NULL){
tt->rtag=1;
tt->rchild=tt->lchild;
}
pre=tt;
pre_thread1(tt->lchild,pre);
}
if ((tt->rtag==0))
if ((tt->rchild==NULL)) tt->rtag=1;
else pre_thread1(tt->rchild,pre);
}
}
void pre_thread_bitre(bitre t,bitre &tt)
{
bitre pre;
copy_bitre(t,tt);
pre=NULL;
pre_thread1(tt,pre);
display_threaded_bitre(" pre_threaded bitre ",tt);
}
void save(bitre t,FILE *ff)
{
boolean k1,k2;
if (t!=NULL){
fprintf(ff,"%c",t->data);
if ((t->ltag==0) && (t->lchild!=NULL)) k1=true;
else k1=false;
if ((t->rtag==0) && (t->rchild!=NULL)) k2=true;
else k2=false;
if (k1) fprintf(ff," 0");
else fprintf(ff," 1");
if (k2) fprintf(ff," 0\n");
else fprintf(ff," 1\n");
if (k1) save(t->lchild,ff);
if (k2) save(t->rchild,ff);
}
}
void save_bitre_file(bitre t,string ss)
{
FILE *ff;
if ((ff=fopen(ss,"w"))==NULL){
printf("\nCan't open file!\007");
getch();
exit(1);
}
fprintf(ff,"bitre\n");
if (t!=NULL) fprintf(ff," 0\n");
else fprintf(ff," 1\n");
save(t,ff);
fclose(ff);
}
void save_bitre(bitre t)
{
char ss[255];
boolean canorno;
strcpy(ss,"bitres\*.");
strcat(ss,extendname);
Savequestion("save bitre to",ss, canorno);
if (canorno) save_bitre_file(t,ss);
}
void load(bitre &t,FILE *ff)
{
int k1,k2;
t=(bitre)malloc(sizeof(struct bnode));
fscanf(ff,"%c%d%d",&(t->data),&k1,&k2);
while (fgetc(ff)!='\n');
if (k1==0){
t->ltag=0;
load(t->lchild,ff);
}else{
t->ltag=1;
t->lchild=NULL;
}
if (k2==0){
t->rtag=0;
load(t->rchild,ff);
}else{
t->rtag=1;
t->rchild=NULL;
}
}
void load_bitre_file(bitre &t,string ss)
{
string bs;
int x;
FILE *ff;
if ((ff=fopen(ss,"r"))==NULL){
printf("\nCan't open file!\007");
getch();
exit(1);
}
fscanf(ff,"%s",bs);
while (fgetc(ff)!='\n');
fscanf(ff,"%d",&x);
while (fgetc(ff)!='\n');
if ( strcmp(bs,"bitre")) printf("file error!\007");
else
if (x==1) t=NULL;
else {
load(t,ff);
Into_graph();
comput_bitre_card(t);
}
fclose(ff);
}
void load_bitre(bitre &t)
{
char ss[255];
boolean selected=true;
strcpy(ss,"bitres\\*.");
strcat(ss,extendname);
Loadquestion("load bitre from ",ss,selected);
if ( selected ) load_bitre_file(t,ss);
}
//====== get bitre menu ======
void handle_bitre_event(pmenunode &pmenu,bitre &t)
{
int xl,yl,xr,yr;
switch (pmenu->command){
case comgrcreatebitre: create_gr_bitre(t);break;
case comexcreatebitre: create_ex_bitre(t);break;
case comreadbitre: load_bitre(t);break;
case comsavebitre: save_bitre(t);break;
case comsetrange: set_bitre_range(t);break;
case comdisp:{
Inputstrinwnd(20,4,60,"disp bitre ",ss);
disp_bitre("bitre",t);
break;
}
case commove1:{
bitre_range(t,xl,yl,xr,yr);
Inputstrinwnd(20,4,65,"move1disp bitre,press enter to move root ",ss);
move1_bitre("bitre",t);
Clear_range(xl,yl,xr,yr);
disp_bitre("bitre",t);
break;
}
case commove2:{
Inputstrinwnd(20,4,60,"move2disp bitre ",ss);
move_bitre("bitre",t);
break;
}
}
}
void handle_bitre_menu(mymenu &bitremenu1,boolean &selectorno,pmenunode &pmenu,bitre &t)
{
// with bitremenu1 do
Mymenu_selectmenu(bitremenu1,pmenu,selectorno);
if (selectorno)
if (Mymenu_issubmenuitem(bitremenu1)){
Mymenu_disabledispsubmenu(bitremenu1,pmenu->numofmenu / 100);
handle_bitre_event(pmenu,t);
}else return;
else return;
}
void handle_bitre(bitre &t)
{
bitre_graph_state=0;
initial_bitre();
bmp=Newmenu1(
Newsubmenu1("建二叉树",
Newmenu1(
Newitem1("图形方式建二叉树"," ",0,0,comgrcreatebitre,
Newitem1("扩展方式建二叉树"," ",0,0,comexcreatebitre,
Newitem1("读文件"," ",0,0,comreadbitre,
Newitem1("存盘"," ",0,0,comsavebitre,
NULL))))),
Newsubmenu1("显示二叉树",
Newmenu1(
Newitem1("设定显示区域"," ",0,0,comsetrange,
Newitem1("按原定位置显示"," ",0,0,comdisp,
Newitem1("平移显示 并清除原位"," ",0,0,commove1,
Newitem1("平移显示 不清除原位"," ",0,0,commove2,
NULL))))),
Newsubmenu1("返回",NULL,NULL))));
Mymenu_init(bitremenu1,bmp);
do{
handle_bitre_menu(bitremenu1,selectorno,pmenu,t);
}while (strcmp(pmenu->menuname,"返回"));
Mymenu_clearmainmenu(bitremenu1);
Mymenu_reset_cursubmenu(bitremenu1);
}
void get_bitre(bitre &t)
{
handle_bitre(t);
}
//====== } get bitre menu ======
/*void bitreinit(bitre &t)
{
bitre_graph_state=0;
initial_bitre();
bmp=Newmenu1(
Newsubmenu1("建二叉树",
Newmenu1(
Newitem1("图形方式建二叉树"," ",0,0,comgrcreatebitre,
Newitem1("扩展方式建二叉树"," ",0,0,comexcreatebitre,
Newitem1("读文件"," ",0,0,comreadbitre,
Newitem1("存盘"," ",0,0,comsavebitre,
NULL))))),
Newsubmenu1("显示二叉树",
Newmenu1(
Newitem1("设定显示区域"," ",0,0,comsetrange,
Newitem1("按原定位置显示"," ",0,0,comdisp,
Newitem1("平移显示 并清除原位"," ",0,0,commove1,
Newitem1("平移显示 不清除原位"," ",0,0,commove2,
NULL))))),
Newsubmenu1("返回",NULL,NULL))));
Mymenu_init(bitremenu1,bmp);
for(i=0;i<4;i++) visitebtmodes[i]=onevisitemode;
vstmp2=Newmenu1(
Newsubmenu1("置访问方式",
Newmenu1(
Newitem1("选择访问方式号","选择访问方式号... ",0,0,comselectmodeno,
Newitem1("设置打印元素值","设置是否打印元素的值... ",0,0,comwritedata,
Newitem1("使用光棒方式","设置是否使用光标... ",0,0,comusecurmove,
Newitem1("设置停顿方式","设置在两次访问之间是否需要停顿... ",0,0,comwaitkey,
Newitem1("设置使用指示器","设置是否需要指示器指示结点.. ",0,0,comuseptr,
Newitem1("显示序号","设置是否需要显示序号...",0,0,comneedno,
NULL))))))),
Newsubmenu1("返回",NULL,NULL)));
Mymenu_init(vstmenu2,vstmp2);
initial_visitemode(visitebtmodes);
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -