本实验包括树的建立,先序,中序,后序和层序遍历,求根到给定节点的路径,并且可以将树的形状横向显示出来。
话不多说,直接上代码。
#include<stdio.h>
#include<string.h>
#define max 100
int node_num=0;//统计节点个数
int book[max];
char bra[]= {"-/\\<"};
typedef struct Bitree {
int num;
struct Bitree *lchild,*rchild;
} binode,*bitree;
int scan();
void build(bitree &T,int sign,int numb);
void first(bitree &T);
void second(bitree &T);
void third(bitree &T);
void ceng(bitree &T);
void findlu(bitree &T);
void find(bitree &T,int process[max],int k,int p);
void puttree(bitree &t,int h) ;
int main() {
bitree la;
while(1) {
printf("请您选择要完成的功能(序号)\n");
printf(" ---------------------------\n");
printf("|1.建立二叉树存储结构 |\n");
printf("|2.求二叉树的先序遍历 |\n");
printf("|3.求二叉树的中序遍历 |\n");
printf("|4.求二叉树的后序遍历 |\n");
printf("|5.求二叉树的层次遍历 |\n");
printf("|6.求根到给定结点的路径 |\n");
printf("|7.显示树 |\n");
printf("|0.结束程序 |\n");
printf(" ---------------------------\n");
int k=scan();
switch(k) {
case 1:
node_num=0;
printf("若节点存在,请输入数字(1,2...)\n若节点为空,请输入任意字符(a,b,c...)\n");
build(la,0,0);
printf("创建成功!\n");
break;
case 2:
if(node_num!=0) {
printf("先序遍历输出为:");
first(la);
printf("\n\n");
} else {
printf("请先按1创建一棵非空树\n");
}
break;
case 3:
if(node_num!=0) {
printf("中序遍历输出为:");
second(la);
printf("\n\n");
} else {
printf("请先按1创建一棵非空树\n");
}
break;
case 4:
if(node_num!=0) {
printf("后序遍历输出为:");
third(la);
printf("\n\n");
} else {
printf("请先按1创建一棵非空树\n");
}
break;
case 5:
if(node_num!=0) {
printf("层序遍历输出为:");
ceng(la);
printf("\n\n");
} else {
printf("请先按1创建一棵非空树\n");
}
break;
case 6:
if(node_num!=0) {
findlu(la);
} else {
printf("请先按1创建一棵非空树\n");
}
break;
case 7:
if(node_num!=0) {
puttree(la,0) ;
} else {
printf("请先按1创建一棵非空树\n");
}
break;
case 0:
return 0;
default:
printf("请输入0~6之间的数字\n");
break;
}
}
printf("感谢使用,再见!\n");
return 0;
}
int scan() {
while(1) {
printf("(输入一个整数)~~\n");
char s[100];
scanf("%s",s);
int ans=0;
for(int i=0; s[i]!='\0'; i++) {
if(s[i]<'0'||s[i]>'9') {
ans++;
break;
}
}
if(ans==0) {
int k=0;
for(int i=0; s[i]; i++) {
k=k*10+(s[i]-'0');
}
return k;
}
}
}
void build(bitree &T,int sign,int numb) {
if(sign==1) {
printf("请输入%d的左子节点\n",numb);
} else if(sign==2) {
printf("请输入%d的右子节点\n",numb);
}
char s[100];
scanf("%s",s);
int ans=1;
for(int i=0; s[i]!='\0'; i++) {
if(s[i]<'0'||s[i]>'9') {
ans=0;
break;
}
}
if(ans==0) {
T=NULL;
} else {
int k=0;
for(int i=0; s[i]!='\0'; i++) {
k=k*10+(s[i]-'0');
}
T = new binode;
T->num=k;
book[node_num++]=T->num;
build(T->lchild,1,T->num);
build(T->rchild,2,T->num);
}
}
void first(bitree &T) {
if(T==NULL) {
return ;
}
printf("%d\t",T->num);
first(T->lchild);
first(T->rchild);
}
void second(bitree &T) {
if(T==NULL) {
return ;
}
second(T->lchild);
printf("%d\t",T->num);
second(T->rchild);
}
void third(bitree &T) {
if(T==NULL) {
return ;
}
third(T->lchild);
third(T->rchild);
printf("%d\t",T->num);
}
void ceng(bitree &T) {
if(T==NULL) {
return ;
}
bitree temp[max];
int in=0,out=0;
temp[in++]=T;
while(in>out) {
if(temp[out]) {
printf("%d \t",temp[out]->num);
temp[in++]=temp[out]->lchild;
temp[in++]=temp[out]->rchild;
}
out++;
}
}
void findlu(bitree &T) {
binode head=*T;
printf("请输入该节点按输入顺序的编号\n");
printf("输入顺序:\t");
for(int i=0; i<node_num; i++) {
printf("%d\t",book[i]);
}
printf("\n编号为: \t");
for(int i=1; i<=node_num; i++) {
printf("%d\t",i);
}
printf("\n");
int k;
while(1) {
k=scan();
if(k>=1 && k<=node_num) {
break;
}
printf("请输入1~%d之间的数字,",node_num);
}
int process[max];
int p=0;
find(T,process,book[k-1],p);
}
void find(bitree &T,int process[max],int k,int p) {
if(T!=NULL) {
process[p++]=T->num;
if(T->num==k) {
printf("路径为:");
for(int i=0; i<p; i++) {
printf(" %d ",process[i]);
if(i!=p-1){
printf("->");
}
}
printf("\n");
} else {
find(T->lchild,process,k,p);
find(T->rchild,process,k,p);
p--;
}
}
}
void puttree(bitree &t,int h) {
int i;
if(t!=NULL) {
puttree(t->rchild,h+1);
for(i=0; i<h; i++)putchar('\t');
printf("%d",t->num);
putchar(bra[((NULL!=(t->lchild))<<1)|(NULL!=(t->rchild))]);
putchar('\n');
puttree(t->lchild,h+1);
}
}