题目描述
给出一棵树的双亲表示法结果,用一个二维数组表示,位置下标从0开始,如果双亲位置为-1则表示该结点为根结点
编写程序,输出该树的孩子链表表示法结果。
输入
输入一棵树的双亲表示法,共3行:
第1行输入n,表示树有n个结点
第2行输入n个英文字母,表示每个树结点的数值
第3行输入n个整数,表示每个结点的双亲在数组的下标
输入样例:
7
A B C D E F G
-1 0 0 0 1 1 3
输出
按输入的结点顺序输出n行,每行输出结点孩子链表结果,先输出结点的数值,再输出结点的孩子的下标,以空格隔开,最后一个数据后面也有空格
如果链表为空则输出结点数值后,输出-1带空格,具体看样式
输出样例:
A 1 2 3
B 4 5
C -1
D 6
E -1
F -1
G -1
代码
#include <iostream>
using namespace std;
struct List{ //表内结点
int index;
List *next;
};
struct Header{ //表头
char word;
List *next;
};
class Tree{
public:
int len;
Header *arr;
Tree(){
cin >> len;
arr = new Header[len];
for(int i = 0; i < len; i++){
cin >> arr[i].word;
arr[i].next = NULL;
}
}
void create(){ //录入孩子结点
int k;
for(int i = 0; i < len; i++){
cin >> k;
if(k >= 0){
List *t = new List;
t->index = i;
t->next = NULL;
if(arr[k].next == NULL){
arr[k].next = t;
}else{
List *s = arr[k].next;
while(s->next != NULL){
s = s->next;
}
s->next = t;
}
}
}
}
void toPrint(){
for(int i = 0; i < len; i++){
cout << arr[i].word << " ";
List *s = arr[i].next;
if(s == NULL){
cout << "-1 " << endl;
continue;
}else{
while(s != NULL){
cout << s->index << " ";
s = s->next;
}
}
cout << endl;
}
}
};
int main()
{
Tree tree;
tree.create();
tree.toPrint();
return 0;
}