二叉树的建立与遍历-数组模拟和链表模拟(2023.3.15以此为准构建和遍历二叉树)
数据结构实验之二叉树的建立与遍历
Time Limit: 1000MS Memory limit: 65536K
题目描述
已知一个按先序序列输入的字符序列,如abc,,de,g,,f,,,(其中逗号表示空节点)。请建立二叉树并按中序和后序方式遍历二叉树,最后求出叶子节点个数和二叉树深度。
输入
输入一个长度小于50个字符的字符串。
输出
输出共有4行:
第1行输出中序遍历序列;
第2行输出后序遍历序列;
第3行输出叶子节点个数;
第4行输出二叉树深度。
示例输入
abc,,de,g,,f,,,
示例输出
cbegdfacgefdba35
1 数组建二叉树 2 3 #include<stdio.h> 4 #include<string.h> 5 struct list 6 { 7 char ch; 8 int l; 9 int r; 10 }num[1000001]; 11 int ns=0; 12 int creat()//创建一个二叉树,返回根节点的编号 13 { 14 ns++; 15 char st; 16 int p=ns; 17 scanf("%c",&st); 18 if(st==',')return -1; 19 else 20 { 21 num[p].ch=st; 22 num[p].l=creat(); 23 num[p].r=creat(); 24 return p; 25 } 26 } 27 void printmid(int rt)//中序输出二叉树 28 { 29 if(num[rt].l!=-1)printmid(num[rt].l); 30 printf("%c",num[rt].ch); 31 if(num[rt].r!=-1)printmid(num[rt].r); 32 } 33 void printhigh(int rt)//后序输出二叉树 34 { 35 if(num[rt].l!=-1)printhigh(num[rt].l); 36 if(num[rt].r!=-1)printhigh(num[rt].r); 37 printf("%c",num[rt].ch); 38 } 39 int printleave(int rt)//求叶子节点的个数 40 { 41 int aa; 42 aa=0; 43 if(num[rt].l==-1&&num[rt].r==-1)return 1; 44 if(num[rt].l!=-1)aa+=printleave(num[rt].l); 45 if(num[rt].r!=-1)aa+=printleave(num[rt].r); 46 return aa; 47 } 48 int printdeep(int rt)//求二叉树的深度 49 { 50 int aa,ll,rr; 51 aa=ll=rr=0; 52 if(num[rt].l==-1&&num[rt].r==-1)return 1; 53 if(num[rt].l!=-1)ll=printdeep(num[rt].l); 54 if(num[rt].r!=-1)rr=printdeep(num[rt].r); 55 aa=ll>rr?ll:rr; 56 return aa+1; 57 } 58 int main() 59 { 60 int root=creat(); 61 printmid(root); 62 printf("\n"); 63 printhigh(root); 64 printf("\n"); 65 printf("%d\n",printleave(root)); 66 printf("%d\n",printdeep(root)); 67 return 0; 68 }
1 链表建二叉树 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 struct node 6 { 7 char a; 8 struct node *l,*r; 9 }*tree; 10 struct node *creat(node *&p) 11 { 12 char ch; 13 scanf("%c",&ch); 14 if(ch==',') 15 return NULL; 16 else 17 { 18 p=(struct node*)malloc(sizeof(struct node)); 19 p->a=ch; 20 p->l=creat(p->l); 21 p->r=creat(p->r); 22 return p; 23 } 24 } 25 void printfmid(struct node *&p) 26 { 27 if(p==NULL) 28 return ; 29 printfmid(p->l); 30 printf("%c",p->a); 31 printfmid(p->r); 32 } 33 void printflate(struct node *&p) 34 { 35 if(p==NULL) 36 return ; 37 printflate(p->l); 38 printflate(p->r); 39 printf("%c",p->a); 40 } 41 int printfleave(struct node *&p) 42 { 43 int aa=0; 44 if(p->l==NULL&&p->r==NULL) 45 return 1; 46 if(p->l!=NULL) 47 aa+=printfleave(p->l); 48 if(p->r!=NULL) 49 aa+=printfleave(p->r); 50 return aa; 51 } 52 int printfdeep(struct node *&p) 53 { 54 int aa,ll,rr; 55 aa=ll=rr=0; 56 if(p->l==NULL&&p->r==NULL) 57 return 1; 58 if(p->l!=NULL) 59 ll=printfdeep(p->l); 60 if(p->r!=NULL) 61 rr=printfdeep(p->r); 62 aa=ll>rr?ll:rr; 63 return aa+1; 64 } 65 int main() 66 { 67 struct node *head; 68 head=creat(head); 69 printfmid(head); 70 printf("\n"); 71 printflate(head); 72 printf("\n"); 73 printf("%d\n",printfleave(head)); 74 printf("%d\n",printfdeep(head)); 75 return 0; 76 77 }