/*二叉树操作程序*/
#include "stdio.h"
#include "stdlib.h"
#define M 50
typedef struct node
{ int data;
struct node *lc;
struct node *rc;
}JD;
main()
{ JD *jlrcs();
void dxxbl(),dzxbl(),dhxbl(),jh();
JD *root,*p;
char ch;
for(;;)
{ printf("\n\n二叉树操作程序\n");
printf("j 建立二叉树\n");
printf("x 先序遍历\n");
printf("z 中序遍历\n");
printf("h 后序遍历\n");
printf("s 交换各结点的左右子树\n");
printf("q 退出\n");
printf("\n请选择 j/x/z/h/s/q : ");
ch=getche();
printf("\n");
switch (ch)
{ case 'j':
printf("\n请按先序序列输入二叉树各个");
printf("结点字符,用#号表示空指针\n");
root=jlrcs();
break;
case 'x':
printf("\n按先序遍历结果是: \n");
dxxbl(root);
break;
case 'z':
printf("\n按中序遍历结果是: \n");
dzxbl(root);
break;
case 'h':
printf("\n按后序遍历结果是: \n");
dhxbl(root);
break;
case 's':
jh(root);
break;
case 'q':
exit(0);
default:
printf("\n选择错误,请重新选择!\n");
}
}
}
JD *jlrcs()
{ /*建立二叉树*/
JD *t;
char x;
scanf("%c",&x);
if (x=='#') t=NULL;
else
{ t=(JD *)malloc(sizeof(JD));
t->data=x;
t->lc=jlrcs();
t->rc=jlrcs();
}
return(t);
}
void dxxbl(JD *r)
{ /*先根遍历*/
if (r!=NULL)
{ printf("%5c",r->data);
dxxbl(r->lc);
dxxbl(r->rc);
}
}
void dzxbl(JD *r)
{ /*中根遍历*/
if (r!=NULL)
{ dzxbl(r->lc);
printf("%5c",r->data);
dzxbl(r->rc);
}
}
void dhxbl(JD *r)
{ /*后根遍历*/
if (r!=NULL)
{ dhxbl(r->lc);
dhxbl(r->rc);
printf("%5c",r->data);
}
}
void jh(JD *r)
{ /*交换结点的左右子树*/
int s2[M],i=0;
JD *p,*t,*s1[M];
p=r;
do
{ while (p!=NULL)
{ s1[i]=p;
s2[i++]=0;
p=p->lc;
}
while ((i>0) && (s2[i-1]==1))
{ p=s1[--i];
t=p->lc;
p->lc=p->rc;
p->rc=t;
}
if (i>0)
{ s2[i-1]=1;
p=s1[i-1];
p=p->rc;
}
}while (i>0);
}
#include "stdio.h"
#include "stdlib.h"
#define M 50
typedef struct node
{ int data;
struct node *lc;
struct node *rc;
}JD;
main()
{ JD *jlrcs();
void dxxbl(),dzxbl(),dhxbl(),jh();
JD *root,*p;
char ch;
for(;;)
{ printf("\n\n二叉树操作程序\n");
printf("j 建立二叉树\n");
printf("x 先序遍历\n");
printf("z 中序遍历\n");
printf("h 后序遍历\n");
printf("s 交换各结点的左右子树\n");
printf("q 退出\n");
printf("\n请选择 j/x/z/h/s/q : ");
ch=getche();
printf("\n");
switch (ch)
{ case 'j':
printf("\n请按先序序列输入二叉树各个");
printf("结点字符,用#号表示空指针\n");
root=jlrcs();
break;
case 'x':
printf("\n按先序遍历结果是: \n");
dxxbl(root);
break;
case 'z':
printf("\n按中序遍历结果是: \n");
dzxbl(root);
break;
case 'h':
printf("\n按后序遍历结果是: \n");
dhxbl(root);
break;
case 's':
jh(root);
break;
case 'q':
exit(0);
default:
printf("\n选择错误,请重新选择!\n");
}
}
}
JD *jlrcs()
{ /*建立二叉树*/
JD *t;
char x;
scanf("%c",&x);
if (x=='#') t=NULL;
else
{ t=(JD *)malloc(sizeof(JD));
t->data=x;
t->lc=jlrcs();
t->rc=jlrcs();
}
return(t);
}
void dxxbl(JD *r)
{ /*先根遍历*/
if (r!=NULL)
{ printf("%5c",r->data);
dxxbl(r->lc);
dxxbl(r->rc);
}
}
void dzxbl(JD *r)
{ /*中根遍历*/
if (r!=NULL)
{ dzxbl(r->lc);
printf("%5c",r->data);
dzxbl(r->rc);
}
}
void dhxbl(JD *r)
{ /*后根遍历*/
if (r!=NULL)
{ dhxbl(r->lc);
dhxbl(r->rc);
printf("%5c",r->data);
}
}
void jh(JD *r)
{ /*交换结点的左右子树*/
int s2[M],i=0;
JD *p,*t,*s1[M];
p=r;
do
{ while (p!=NULL)
{ s1[i]=p;
s2[i++]=0;
p=p->lc;
}
while ((i>0) && (s2[i-1]==1))
{ p=s1[--i];
t=p->lc;
p->lc=p->rc;
p->rc=t;
}
if (i>0)
{ s2[i-1]=1;
p=s1[i-1];
p=p->rc;
}
}while (i>0);
}