PAT甲级Invert a Binary Tree 柳神层序遍历的思路值得借鉴

1102 Invert a Binary Tree (25分)

The following is from Max Howell @twitter:

Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off.

Now it’s your turn to prove that YOU CAN invert a binary tree!
Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤10) which is the total number of nodes in the tree – and hence the nodes are numbered from 0 to N−1. Then N lines follow, each corresponds to a node from 0 to N−1, and gives the indices of the left and right children of the node. If the child does not exist, a - will be put at the position. Any pair of children are separated by a space.
Output Specification:

For each test case, print in the first line the level-order, and then in the second line the in-order traversal sequences of the inverted tree. There must be exactly one space between any adjacent numbers, and no extra space at the end of the line.
Sample Input:

8
1 -

0 -
2 7

5 -
4 6

Sample Output:

3 7 2 6 4 0 5 1
6 5 7 4 3 2 0 1

思路:就注意是翻转的二叉树,反转就是输入的左孩子,保存到右孩子的位置,就行了,然后层序 中序遍历就好啦。

#include <iostream>
#include <string>
using namespace std;
#include<vector>
#include<queue>

struct node
{

    int num;
    node *rchild,*lchild;
    node():rchild(NULL),lchild(NULL) {}//最初时候左右孩子节点指针都是NULL
};

vector<int> out2;
vector<int> out1;

void inOrder(node *root)//中序遍历
{
    if(root==NULL)
        return;
    inOrder(root->lchild);
    //cout<<root->num;
    out2.push_back(root->num);
    inOrder(root->rchild);
}

int main()
{
    int N;
    cin>>N;
    int info[N][2];
    for(int i=0; i<N; i++)//记录保存结点左右孩子的信息
    {
        char a,b;
        cin>>a>>b;
        if(a!='-')
        {
            info[i][0]=a-'0';
        }
        else
            info[i][0]=-1;
        if(b!='-')
        {
            info[i][1]=b-'0';
        }
        else
            info[i][1]=-1;
    }

    int sign[N]= {0}; //这样才能全部赋值为0  ,里面填1 就是sign[0]是1 其他为0,求那个事根节点
    node sn[N];//从新开辟了空间g++ 编译器 可支持这种写法,要不然就直接生成999个结点的数组也行
    for(int i=0; i<N; i++)//赋值每个孩子结点的左右指针,并顺便判断谁是根节点,没有父节点的就是了
    {
        sn[i].num=i;
        if(info[i][1]!=-1)//1存储的右孩子信息,但是使用lchild 左孩子指针指向,这就是翻转了
        {
            sn[i].lchild=&sn[info[i][1]];
            sign[info[i][1]]=-1;
        }
        if(info[i][0]!=-1)
        {
            sn[i].rchild=&sn[info[i][0]];
            sign[info[i][0]]=-1;
        }
    }
    int root;
    for(int i=0; i<N; i++)
        if(sign[i]==0)
            root=i;

    inOrder(&sn[root]);
    
    //下面是实现层序遍历
    vector<int> out1;

    queue<node*> que;
    que.push(&sn[root]);

    while(que.size()!=0)
    {
        queue<node*> get;
        while(!que.empty())
        {
            out1.push_back(que.front()->num);

            if(que.front()->lchild!=NULL)
                get.push(que.front()->lchild);
            if(que.front()->rchild!=NULL)
                get.push(que.front()->rchild);

            que.pop();
        }
        que=get;
    }

     //层序输出
    for(int i=0; i<out1.size(); i++)
    {
        if(i==0)
        cout<<out1[i];
        else
            cout<<' '<<out1[i];
    }
    //中序输出
       cout<<endl;
    for(int i=0; i<out2.size(); i++)
    {
        if(i==0)
        cout<<out2[i];
        else
            cout<<' '<<out2[i];
    }






    return 0;
}


我也看了看柳神的代码,感觉还是差距啊,50行搞定,层序遍历实现也很巧妙

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值