程序的输入是一个表示树结构的广义表。假设树的根为 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 |
#include <stdio.h>
#define MAX 100
char data[MAX]; // 输入数据
int level[MAX]; // 数据层级
int dataAmount = 0, maxDegree = 0; // 数据数量,度最大值
int degreeCount[MAX] = {0}; // 记录每个节点的度数
void readInput() // 逐个读取字符,处理不同字符
{
char c;
int depth = -1; // 可以当做一个标号,给数组的每个元素标上层级号
while ((c = getchar()) != '\n')
{
switch (c)
{
case '(':
depth++;
break;
case ')':
depth--;
break;
case ',':
break;
default:
dataAmount++;
data[dataAmount] = c;
level[dataAmount] = depth;
break;
}
}
}
int main()
{
readInput();
for (int i = 1; i <= dataAmount; i++) // 获取每个节点的层级并存入degreeCount
{
printf("%*s%c\n", level[i] * 4, "", data[i]); // 根据层级进行Tab
for (int j = i + 1; j <= dataAmount && level[j] > level[i]; j++) // 遍历当前节点i后面的节点j,若j的层级比i的层级大1,则将i的度数加1。
if (level[j] == level[i] + 1)
degreeCount[i]++;
if (degreeCount[i] > maxDegree)
maxDegree = degreeCount[i];
}
printf("Degree of tree: %d\n", maxDegree);
for (int i = 0; i <= maxDegree; i++)
{
int count = 0;
for (int j = 1; j <= dataAmount; j++)
if (degreeCount[j] == i)
count++;
printf("Number of nodes of degree %d: %d\n", i, count);
}
return 0;
}