以下是来自 Max Howell @twitter
的内容:
谷歌:我们的百分之九十的工程师都使用你编写的软件,但是你连在白板上反转二叉树都做不到,还是滚吧。
现在,请你证明你会反转二叉树。
输入格式
第一行包含一个整数 NN,表示树的结点数量。
所有结点编号从 00 到 N−1N−1。
接下来 NN 行,每行对应一个 0∼N−10∼N−1 的结点,给出该结点的左右子结点的编号,如果该结点的某个子结点不存在,则用 −
表示。
输出格式
输出反转后二叉树的层序遍历序列和中序遍历序列,每个序列占一行。
相邻数字之间用空格隔开,末尾不得有多余空格。
数据范围
1≤N≤101≤N≤10
输入样例:
8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6
输出样例:
3 7 2 6 4 0 5 1
6 5 7 4 3 2 0 1
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int N=20;
int n;
queue<int>q;
int l[N],r[N];
bool fa[N];
int k;
int root;
void dfs_reverse(int u)
{
if(~l[u]) dfs_reverse(l[u]);
if(~r[u]) dfs_reverse(r[u]);
swap(l[u],r[u]);
}
void bfs()
{
q.push(root);
int flag=1;
while(!q.empty())
{
auto t=q.front();
if(!flag) cout<<" ";
cout<<t;
flag=0;
q.pop();
if(~l[t]) q.push(l[t]);
if(~r[t]) q.push(r[t]);
}
cout<<endl;
}
void inorder(int u,int &k)
{
if(u==-1) return;
if(~l[u]) inorder(l[u],k);
cout<<u;
if(++k!=n) cout<<" ";
if(~r[u]) inorder(r[u],k);
}
int main()
{
memset(l,-1,sizeof(l));
memset(r,-1,sizeof(r));
cin>>n;
for(int i=0;i<n;i++)
{
char a,b;
cin>>a>>b;
if(a!='-') l[i]=a-'0',fa[l[i]]=true;
if(b!='-') r[i]=b-'0',fa[r[i]]=true;
}
for(int i=0;i<n;i++)
{
if(!fa[i])
{
root=i;
break;
}
}
dfs_reverse(root);
bfs();
inorder(root,k);
}