反转二叉树

以下是来自 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);
  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值