二叉树的建立与遍历-数组模拟和链表模拟(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 }

 

posted @ 2023-03-15 00:17  CRt0729  阅读(48)  评论(0编辑  收藏  举报