数据结构实验之 二叉树的建立与遍历

题目:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2136&cid=1184

自己重新写的:

下面的代码如果建树 不想要返回值的话,也可以这些写 void build(tree *&p) { },这样用引用可以自动 改变L和R的指向。

如果不加引用的话,就要用返回值了。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cmath>
 6 #include <queue>
 7 #include <vector>
 8 #include <algorithm>
 9 const int maxn = 100 + 10;
10 using namespace std;
11 int n, num, cnt;
12 char s[maxn];
13 typedef struct node
14 {
15     char data;
16     struct node *l, *r;
17 }tree;
18 
19 tree *build(tree *p)
20 {
21     if(num>=n || s[num]==',')
22         return NULL;
23     p = new tree;
24     p->data = s[num];
25     num ++;
26     p->l = build(p->l);
27     num ++;
28     p->r = build(p->r);
29     return p;
30 }
31 void inorder(tree *p)
32 {
33     if(p)
34     {
35         inorder(p->l);
36         cout<<p->data;
37         inorder(p->r);
38     }
39 }
40 void postorder(tree *p)
41 {
42     if(p)
43     {
44         postorder(p->l);
45         postorder(p->r);
46         cout<<p->data;
47     }
48 }
49 void leaf(tree *p)
50 {
51    if(p)
52    {
53       if(p->l==NULL && p->r==NULL)
54       {
55          cnt++;
56          return;
57       }
58       leaf(p->l);
59       leaf(p->r);
60    }
61 }
62 int deep(tree *p)
63 {
64     if(p)
65     {
66        int a, b;
67        a = deep(p->l); b = deep(p->r);
68        return a>b?a+1:b+1;
69     }
70     else
71      return 0;
72 }
73 
74 int main()
75 {
76     while(cin>>s)
77     {
78         n = strlen(s);
79         num = cnt = 0;
80         tree *head, *p;
81         head = build(p);
82 
83         inorder(head);
84         cout<<endl;
85         postorder(head);
86         cout<<endl;
87         leaf(head);
88         cout<<cnt<<endl;
89         cout<<deep(head)<<endl;
90     }
91     return 0;
92 }

 

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<stdlib.h>
 5 #include<queue>
 6 
 7 using namespace std;
 8 
 9 int sum=0;
10 struct tree *p;
11 struct tree
12 {
13     char data;
14     struct tree *l,*r;
15 };
16 
17 struct tree* build(struct tree *p)//建树
18 {
19     char c;
20     c=getchar();
21     p=(struct tree*)malloc(sizeof(struct tree));
22 
23     if(c==',')
24         p=NULL;
25     else
26     {
27         p->data=c;
28         p->l=build(p->l);
29         p->r=build(p->r);
30     }
31     return p;
32 };
33 
34 void inorder(struct tree *p)//中序遍历
35 {
36     if(p)
37     {
38         inorder(p->l);
39         printf("%c",p->data);
40         inorder(p->r);
41     }
42 };
43 
44 void postorder(struct tree *p)//后序遍历
45 {
46     if(p)
47     {
48         postorder(p->l);
49         postorder(p->r);
50         printf("%c",p->data);
51     }
52 };
53 
54 int leaf(struct tree *p)//叶子个数
55 {
56     if(p)
57     {
58         if(p->l==NULL&&p->r==NULL)
59             sum++;
60         leaf(p->l);
61         leaf(p->r);
62     }
63     return sum;
64 };
65 
66 int deep(struct tree *p)//树的深度
67 {
68      int left,right;
69     if(!p) return 0;
70     else
71     {
72         left=deep(p->l);
73         right=deep(p->r);
74         return 1+(left>right?left:right);//取左右子树深度的最大值加一返回 
75     }
76     return 1;
77 };
78 
79 int main()
80 {
81     struct tree *root;
82     root=build(p);
83     inorder(root);
84     printf("\n");
85     postorder(root);
86     printf("\n");
87     sum=leaf(root);
88     printf("%d\n",sum);
89     printf("%d\n",deep(root));
90 }

 

其他操作:

int CountNode(BiTree T) //统计二叉树的节点个数

{

if(!T)

return 0;

else

return 1+CountNode(T->lchild)+CountNode(T->rchild);

}

posted @ 2013-07-01 13:37  水门  阅读(505)  评论(0编辑  收藏  举报