题目描述
给出一棵树的双亲表示法结果,用一个二维数组表示,位置下标从0开始,如果双亲位置为-1则表示该结点为根结点
编写程序,输出该树的先根遍历结果。
输入
第一个输入t,表示有t棵树
接着每棵树输入3行:
第1行输入n,表示树有n个结点
第2行输入n个英文字母,表示每个树结点的数值
第3行输入n个整数,表示每个结点的双亲在数组的下标
以此类推输入下一棵树
输入样例:
2
7
A B C D E F G
-1 0 0 0 1 1 3
10
A B C D R E F G H K
4 4 4 0 -1 0 2 6 6 6
输出
共输出t行,每行输出一棵树的先根遍历结果
输出样例:
ABEFCDG
RADEBCFGHK
思路
1、设置一个stack,即将输出孩子的双亲下标
2、遍历处理
3、以样例为例
代码
#include <iostream>
#include <stack>
using namespace std;
struct List{
char word;
int index;
int flag; //标志是否已经输出,0未输出,1已输出
};
class Tree{
public:
int len;
List *arr;
Tree(){
cin >> len;
arr = new List[len];
for(int i = 0; i < len; i++){
cin >> arr[i].word;
}
for(int i = 0; i < len; i++){
cin >> arr[i].index;
arr[i].flag = 0;
}
}
void DLR(){
stack<int> sta;
for(int i = 0; i < len; i++){ //根结点输出
if(arr[i].index == -1){
cout << arr[i].word;
arr[i].flag = 1;
sta.push(i);
break;
}
}
while(!sta.empty()){
int flag2=0;
for(int i = 0; i < len; i++){
if(arr[i].index == sta.top() && arr[i].flag == 0){
cout << arr[i].word;
arr[i].flag = 1;
sta.push(i);
flag2 = 1;
break;
}
}
if(flag2 == 0){ //遍历一趟后若无孩子则pop栈顶元素
sta.pop();
}
}
}
};
int main()
{
int t;
cin >> t;
while(t--){
Tree tree;
tree.DLR();
cout << endl;
}
return 0;
}