数据结构实验之二叉树的建立与遍历
题目描述
已知一个按先序序列输入的字符序列,如abc,,de,g,,f,,,(其中逗号表示空节点)。请建立二叉树并按中序和后序方式遍历二叉树,最后求出叶子节点个数和二叉树深度。
输入
输入一个长度小于50个字符的字符串。
输出
输出共有4行:
第1行输出中序遍历序列;
第2行输出后序遍历序列;
第3行输出叶子节点个数;
第4行输出二叉树深度。
第1行输出中序遍历序列;
第2行输出后序遍历序列;
第3行输出叶子节点个数;
第4行输出二叉树深度。
示例输入
abc,,de,g,,f,,,
示例输出
cbegdfa cgefdba 3 5
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 struct tree 5 { 6 char data; 7 struct tree *lchild; 8 struct tree *rchild; 9 }; 10 struct tree *creat(struct tree *bt,int k) 11 { 12 struct tree *p; 13 char x; 14 p=(struct tree *)malloc(sizeof(struct tree)); 15 scanf("%c",&x); 16 if(x!=',') 17 { 18 if(!(p=(struct tree *)malloc(sizeof(struct tree)))) 19 exit(0); 20 p->data=x; 21 p->lchild=NULL; 22 p->rchild=NULL; 23 if(k==0) 24 bt=p; 25 if(k==1) 26 bt->lchild=p; 27 if(k==2) 28 bt->rchild=p; 29 creat(p,1); 30 creat(p,2); 31 } 32 return (bt); 33 } 34 int visit1(struct tree *bt) 35 { 36 if(bt!=NULL) 37 { 38 visit1(bt->lchild); 39 printf("%c",bt->data); 40 visit1(bt->rchild); 41 } 42 return 0; 43 } 44 int visit2(struct tree *bt) 45 { 46 if(bt!=NULL) 47 { 48 visit2(bt->lchild); 49 visit2(bt->rchild); 50 printf("%c",bt->data); 51 } 52 return 0; 53 } 54 int leaf (struct tree *bt) 55 { 56 if(!bt) 57 return 0; 58 else if(!bt->lchild&&!bt->rchild) 59 return 1; 60 else 61 return (leaf(bt->lchild)+leaf(bt->rchild)); 62 } 63 int deep (struct tree *bt) 64 { 65 int d=0; 66 if(bt) 67 { 68 int lchilddeep=deep(bt->lchild); 69 int rchilddeep=deep(bt->rchild); 70 d=lchilddeep>=rchilddeep?lchilddeep+1:rchilddeep+1; 71 } 72 return d; 73 } 74 75 int main () 76 { 77 struct tree *p; 78 p=(struct tree *)malloc(sizeof(struct tree)); 79 p=creat(p,0); 80 visit1(p); 81 printf("\n"); 82 visit2(p); 83 printf("\n"); 84 printf("%d\n",leaf(p)); 85 printf("%d\n",deep(p)); 86 return 0; 87 } 88