在本实验中,程序的输入是一个表示树结构的广义表。假设树的根为 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 |
建这种一个节点有多棵子树的树时,可采用FirstChild-NextSibling Representation方法建树。具体的操作就是用到栈和队列来建树。这题我偷懒了,用的是C++的STL,老师课上应该栈和队列用纯C的函数来实现的。
#include<cstdio>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#include<iostream>
#define MAXN 200
using namespace std;
typedef char ElementType;
struct TreeNode
{
int degree;
int level;
ElementType Element;
struct TreeNode *FirstChild;
struct TreeNode *NextSibling;
};
typedef struct TreeNode *Position, *Tree;
queue<Tree> Q; stack<Tree> S;
int ceng;
int Degree_Tree = 0;
int dgree[100];
int Getmax(int a, int b)
{
return a > b ? a : b;
}
Tree CreatTree(Tree T, char letter[]) //用到了栈和队列
{
int i = 0;
for (; letter[i]; i++)
{
if (letter[i] == '(')
{
ceng++;
continue;
}
else if (letter[i] == ',')
continue;
else if (letter[i] == ')')
{
ceng--;
continue;
}
else
{
Tree t = (Tree)malloc(sizeof (struct TreeNode));
t->Element = letter[i];
t->FirstChild = t->NextSibling = NULL;
t->level = ceng;
t->degree = 0;
Q.push(t);
}
}
while (!Q.empty())
{
if (Q.front()->level > S.top()->level)
{
S.top()->FirstChild = Q.front();
S.push(Q.front());
Q.pop();
}
else if (Q.front()->level == S.top()->level)
{
S.top()->NextSibling = Q.front();
S.push(Q.front());
Q.pop();
}
else
{
//int num = 0;
while (Q.front()->level < S.top()->level)
{
S.pop();// num++;
}
//S.top()->degree += num;
}
}
return T;
}
void Printline(Tree T,int depth)
{
for (int i = 0; i < depth; i++)
printf(" ");
printf("%c\n", T->Element);
}
void ListTree(Tree T,int depth)
{
Tree C;
if (T)
{
Printline(T,depth);
if (T->FirstChild)
{
for (C = T->FirstChild; C; C = C->NextSibling)
{
ListTree(C, depth + 1);
(T->degree)++;
}
}
dgree[T->degree]++;
Degree_Tree=max(Degree_Tree, T->degree);
}
}
int main()
{
//freopen("1.txt", "r", stdin);
Tree t = (Tree)malloc(sizeof (struct TreeNode));
t->FirstChild = t->NextSibling = NULL;
t->level = 0;
S.push(t);
char letter[200];
gets(letter);
Tree root= CreatTree(t, letter)->FirstChild;
ListTree(root,0);
printf("Degree of tree: %d\n",Degree_Tree);
for (int i = 0; i <= Degree_Tree; i++)
{
printf("Number of nodes of degree %d: %d\n",i,dgree[i]);
}
}