树的建立与基本操作(10分)
成绩: 10 / 折扣: 0.8
在本实验中,程序的输入是一个表示树结构的广义表。假设树的根为 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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct treenode
{
char data;
int parents;
int degree;
};
int CreateTree(char in[100],struct treenode tree[100],int list[100])
{
int i,j,k=1,len,kuo=0;
len = strlen(in);
tree[0].data = in[1];
tree[0].parents = -1;
list[0]=1;
for (i = 0;i < len;i++)
{
tree[i].data = in[i];
tree[i].parents = -1;
tree[i].degree = 0;
}
for (i = 2;i < len-1;i++)
{
if (in[i] == ',' || in[i] == '(' || in[i] == ')')
{
continue;
}
else
{
for (j = i , kuo = 0;j >= 0 && kuo != 2;j--)
{
if (in[j] == '(')
{
kuo++;
if (kuo == 2)
{
break;
}
}
else if (in[j] == ')')
{
kuo--;
}
}
tree[i].data = in[i];
tree[i].parents = j+1;
tree[j+1].degree++;
list[k++] = i;
}
}
return k;
}
PrintTree(struct treenode tree[100],int list[100],int i)
{
int space = 0 , j = i;
if (i == 0)
{
printf("%c\n",tree[list[i]].data);
return;
}
i=list[i];
while (tree[i].parents != -1)
{
space+=4;
i=tree[i].parents;
}
for (i=0;i<space;i++)
{
printf(" ");
}
printf("%c\n",tree[list[j]].data);
}
void main()
{
int i,j,k,n,max,degree[100],list[100];
char in[100];
struct treenode tree[100];
gets(in);
n = CreateTree(in,tree,list);
for (i=0,max=0;i<n;i++)
{
PrintTree(tree,list,i);
if (tree[list[i]].degree > max)
{
max = tree[list[i]].degree;
}
}
for (i = 0;i <= max;i++)
{
degree[i] = 0;
}
for (i = 0;i <n;i++)
{
degree[tree[list[i]].degree]++;
}
printf("Degree of tree: %d\n",max);
for (i = 0;i<=max;i++)
{
printf("Number of nodes of degree %d: %d\n",i,degree[i]);
}
}