poj 3437这道题不难,不过考察的知识点比较多。
给出深度优先遍历一棵数的数据,求这棵树用左儿子右兄弟的方法变成二叉树后,变化前后的深度。
涉及的知识有:
1. 求树的深度;2. 递归;3. 左儿子右兄弟表示法。
1 #include <iostream>
2
3 using namespace std;
4
5 const int maxn=20010;
6 char s[maxn];
7
8 int dfs(int b,int e,int &d)
9 {
10 if(b>e) return 0;
11 int i,j,k=b,cnt=1,maxi=0,res,maxd=0,td;
12 int flag;
13 while(k<=e){
14 i=k;
15 flag=(s[k]=='d')?1:-1;
16 while(flag!=0){
17 if(s[++k]=='d') flag++;
18 else flag--;
19 }
20 j=k++;
21 td=0;
22 res=dfs(i+1,j-1,td);
23 if(td>maxd) maxd=td;
24 if(cnt+res>maxi) maxi=cnt+res;
25 cnt++;
26 }
27 d=maxd+1;
28 return maxi;
29 }
30
31 int main()
32 {
33 int cnt=1;
34 while(true){
35 gets(s);
36 if(s[0]=='#') return 1;
37 int depth=0;
38 int len=strlen(s);
39 int res=dfs(0,len-1,depth);
40 printf("Tree %d: %d => %d\n",cnt++,depth,res);
41 }
42 return 1;
43 }