考查点:静态数组表示二叉树,中序遍历,BFS
思路:这里不要硬性使用指针表示二叉树,根据输入条件显然用数组表示很方便,而且同样可以进行中序遍历和bfs,题目中的翻转只是幌子,只要接收数据时候左右子树逆序接受就行
#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#define FOR(i, x, y) for(int i = x; i < y; i++)
#define rFOR(i, x, y) for(int i = x; i > = y; i--)
#define MAXN 10005
#define oo 0x3f3f3f3f
using namespace std;
const int maxn=150;
struct node{
int lchild;
int rchild;
}Node[maxn];
bool h[maxn];
int n,num;
void print(int id){
printf("%d",id);
num++;
if(num<n)printf(" ");
else printf("\n");
}
void in(int root){
if(Node[root].lchild!=-1) in(Node[root].lchild);
print(root);
if(Node[root].rchild!=-1) in(Node[root].rchild);
}
void BFS(int root){
queue<int> q;
q.push(root);
while(!q.empty()){
int t=q.front();
q.pop();
print(t);
if(Node[t].lchild!=-1) q.push(Node[t].lchild);
if(Node[t].rchild!=-1) q.push(Node[t].rchild);
}
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif // LOCAL
scanf("%d",&n);
int root;
char rchild,lchild;
FOR(i,0,n)
{
scanf("%*c%c %c",&rchild,&lchild);
if(rchild!='-') Node[i].rchild=rchild-'0';
else Node[i].rchild=-1;
if(lchild!='-') Node[i].lchild=lchild-'0';
else Node[i].lchild=-1;
h[rchild]=1,h[lchild]=1;
}
FOR(i,0,n)
{
if(h[i+'0']==0){
root=i;break;
}
}
BFS(root);
num=0;
in(root);
return 0;
}