1 问题描述
程序的输入是一个表示树结构的广义表。假设树的根为 root ,其子树森林 F = ( T1 , T2 , … , Tn ),设与该树对应的广义表为 L ,则 L =(原子,子表 1 ,子表 2 , … ,子表 n ),其中原子对应 root ,子表 i ( 1<i<=n )对应 Ti 。例如:广义表 (a,(b,(c),(d)),(f,(g),(h ),(i))) 表示的树如图所示:
程序的输出为树的层次结构、树的度以及各种度的结点个数。
在输出树的层次结构时,先输出根结点,然后依次输出各个子树,每个子树向里缩进 4 个空格,如:针对上图表示的树,输出的内容应为:
a
b
c
d
f
g
h
i
Degree of tree: 3
Number of nodes of degree 0: 5
Number of nodes of degree 1: 0
Number of nodes of degree 2: 2
Number of nodes of degree 3: 1
例: (下面的黑体为输入)
(a,(b),(c,(d),(e,(g),(h )),(f)))
a
b
c
d
e
g
h
f
Degree of tree: 3
Number of nodes of degree 0: 5
Number of nodes of degree 1: 0
Number of nodes of degree 2: 2
Number of nodes of degree 3: 1
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 3 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
2 解题
<1> 当做字符串处理
- 不建立树,但是心里还是有一个树的基本架构
//把他完全当做一串字符来处理
#include <cstdio>
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include<cstring>
using namespace std;
//按照格式打印节点
void formatprint(char c[],int le[],int n){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<le[i];j++)
cout<<" ";
cout<<c[i]<<endl;
}
}
int main(int argc,char*argv[]){
char c,ch[100]; //读取字符,,储存字符
int maxdegree=0; //最大的度
int i,j;
int num=0; //下标
int level[100]; //和ch的下标对应,值得意义是ch[i]这个字符位于第几层(depth)
int depth=-1;
int degree[100]={0};
int counts[100]={0};
//freopen("file in.txt","r",stdin);
c=getchar(); //读取字符
while(c!='\n'){
switch(c){
case '(':depth++;break;
case ')':depth--;break;
case ',':break; //只存字母,其他的都不要
case ' ':break; //给的示范案例中有一个空格,一开始没有看到,害我平白无故长度变长了,调试了半天
default:
ch[num]=c; //存入当前字符
level[num++]=depth; //刚刚存入字符位于第几层,之后num增加1
break;
}
c=getchar();
}
formatprint(ch,level,num);
for(i=0;i<num-1;i++){ //每一个字符都要和他之后的所有的比较一次
for(j=i+1;j<num;j++){
if(level[j]==level[i]) //说明遇到了和i同一层的j了,这时候应该跳过这个i了,开始下轮,因为之后的
//位于i+1层(下一层)的已经不是i的子节点了,是j的子节点
break;
if(level[i]+1==level[j]) //说明j是i的下一层,那么i这个位置的度+1
degree[i]++;
}
maxdegree=maxdegree>degree[i]?maxdegree:degree[i]; //比较的更大的
}
cout<<"Degree of tree: "<<maxdegree<<endl;
for(i=0;i<num;i++){
counts[degree[i]]++; //用来存储不同度的个数,度直接作为下标,而度的信息是存在degree中的
}
for(i=0;i<maxdegree+1;i++){ //maxdegree已经是最大的了
cout<<"Number of nodes of degree "<<i<<": "<<counts[i]<<endl;
}
return 0;
}
- 输入的字符串中可能藏有空格,刚开始没有想到卡了好半天