树的表示方法有多种,如图6_1采用的就是一种形象的树形表示法;另外还有一种常用的表示方法"括号表示法",它的表示方法归纳如下:先将整棵树的根结点放入一对圆括号中,然后把它的子树由左至右放入括号中,同层子树用圆括号括在一起(同层子树之间用逗号隔开),而对子树也采用同样的方法处理,直到所有的子树都只有一个根结点为止。用括号表示法表示图6_1的步骤如下:
=(T)
=(1(T1,T2 ,T3 )) {1是根结点,有3棵子树,用逗号隔开}
=(1(2(T11,T12),3,4(T31))) {分别对3棵子树做同样的操作}
=(1(2(5,6),3,4(7(T311,T312))))
=(1(2(5,6),3,4(7(8,9))))
实际上,以上方法是按照树的层次逐步展开,直到所有结点都已列出。
注意,当一个节点有若干个子树时,子节点编号小的写在前面,编号大的写在后面。
给你一棵n个节点的有根树,节点标号为1~n,1号节点为根节点。
请给出它的括号表示结果。
输入 复制
3
2 2 3
0
0
输出 复制
(1(2,3))
改一下
#include<bits/stdc++.h>
using namespace std;
struct c{
int data;
c* next;
};
struct p{
int data;
c* child;
};
struct tree{
p a[100];
int n;
};
tree t;
int main()
{
cin>>t.n;
for(int i=1;i<=t.n;i++)
{
cin>>t.a[i].data;
t.a[i].child=NULL;
int cn;
cin>>cn;
if(cn!=0)
{
t.a[i].child=new c;
cin>>t.a[i].child->data;
t.a[i].child->next=NULL;
c*p=t.a[i].child;
while(cn){
c*s=new c;
cin>>s->data;
s->next=NULL;
p->next=s;
p=p->next;
cn--;
}
}
}
cout<<"1"<<endl;
for(int i=1;i<=t.n;i++){
c*k=t.a[i].child;
while(k)
{
cout<<t.a[i].data<<"."<<t.a[k->data].data<<endl;
k=k->next;
}
}
return 0;
}