题意:给你一棵树,让你bfs一遍,然后中序遍历一遍。
坑点:Invert这个单词的含义是反转的意思,也就是左右子树要互换。建树完了,跑一边遍历序列就好了。
#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define MAXN 15
#define maxnode 1000005
#define sigma_size 26
#define md 12345678
#define INF 0x3f3f3f3f
#define pii pair<int,int>
using namespace std;
struct node
{
int ch[2];
node()
{
memset(ch,-1,sizeof(ch));
}
};
int n,root;
node P[MAXN];
bool vis[MAXN];
bool flag;
void bfs() //层次遍历
{
queue<int> Q;
Q.push(root);
bool first=true;
while(!Q.empty())
{
int x=Q.front();
Q.pop();
if(first)
printf("%d",x),first=false;
else
printf(" %d",x);
if(P[x].ch[0]!=-1)
Q.push(P[x].ch[0]);
if(P[x].ch[1]!=-1)
Q.push(P[x].ch[1]);
}
}
void dfs(int u) //中序遍历
{
if(P[u].ch[0]!=-1)
dfs(P[u].ch[0]);
if(flag)
printf("%d",u),flag=false;
else
printf(" %d",u);
if(P[u].ch[1]!=-1)
dfs(P[u].ch[1]);
}
int main()
{
scanf("%d",&n);
char L,R,cp;
flag=true; //dfs遍历时对第一个输出进行特殊处理
for(int i=0;i<n;i++)
{
getchar();
scanf("%c%c%c",&L,&cp,&R);
if(L!='-')
P[i].ch[1]=L-'0',vis[L-'0']=true;
if(R!='-')
P[i].ch[0]=R-'0',vis[R-'0']=true;
}
for(int i=0;i<n;i++) //用来寻找根节点
{
if(!vis[i])
{
root=i;
break;
}
}
bfs();
printf("\n");
dfs(root);
return 0;
}