【分析】
这题就是简单的二叉树遍历,invert的话,只要输入的时候把左右孩子调换一下即可。
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
struct Node {
int data;
int lchild, rchild;
}nodes[11];
int hashT[11] = {false}; // 找根结点用的
vector<int> layerOrder(int root) {
queue<int> q;
q.push(root);
vector<int> v;
while(!q.empty()) {
int top = q.front();
v.push_back(top);
q.pop();
if(nodes[top].lchild != -1) {
q.push(nodes[top].lchild);
}
if(nodes[top].rchild != -1) {
q.push(nodes[top].rchild);
}
}
return v;
}
void inOrder(int root, vector<int> &v) {
if(root == -1) return;
inOrder(nodes[root].lchild, v);
v.push_back(root);
inOrder(nodes[root].rchild, v);
}
int main() {
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
char t1,t2;
scanf("\n%c %c", &t1, &t2);
if(t1 == '-') nodes[i].rchild = -1;
else {
nodes[i].rchild = t1 - '0';
hashT[nodes[i].rchild] = true;
}
if(t2 == '-') nodes[i].lchild = -1;
else {
nodes[i].lchild = t2 - '0';
hashT[nodes[i].lchild] = true;
}
}
// 找根结点
int root;
for(int i = 0; i < n; i++) {
if(hashT[i] == false) {
root = i;
break;
}
}
vector<int> v1, v2;
v1 = layerOrder(root);
for(int i = 0; i < n; i++) {
if(i != 0) {
printf(" ");
}
printf("%d", v1[i]);
}
printf("\n");
inOrder(root, v2);
for(int i = 0; i < n; i++) {
if(i != 0) {
printf(" ");
}
printf("%d", v2[i]);
}
printf("\n");
return 0;
}