zoukankan      html  css  js  c++  java
  • 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 <algorithm>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <iomanip>
    
    using namespace std;
    struct tree
    {
        int l,r;
    }s[10];
    int n,v[10],head,flag = 0;
    char a,b;
    void invert(int head)
    {
        if(head == -1)return;
        invert(s[head].l);
        invert(s[head].r);
        swap(s[head].l,s[head].r);
    }
    void in_order(int head)
    {
        if(head == -1)return;
        in_order(s[head].l);
        if(flag)printf(" %d",head);
        else printf("%d",head);
        flag ++;
        in_order(s[head].r);
    }
    void level_order(int head)
    {
        int q[10],he = 0,ta = 0;
        if(head == -1)return ;
        q[ta ++] = head;
        while(he < ta)
        {
            int i = q[he];
            if(s[i].l != -1)q[ta ++] = s[i].l;
            if(s[i].r != -1)q[ta ++] = s[i].r;
            if(he)cout<<' '<<q[he ++];
            else cout<<q[he ++];
        }
        cout<<endl;
    }
    int main()
    {
        cin>>n;
        for(int i = 0;i < n;i ++)
        {
            cin>>a>>b;
            if(a != '-')s[i].l = a - '0',v[s[i].l] = 1;
            else s[i].l = -1;
            if(b != '-')s[i].r = b - '0',v[s[i].r] = 1;
            else s[i].r = -1;
        }
        for(int i = 0;i < n;i ++)
        if(!v[i])
        {
            head = i;
            break;
        }
        invert(head);
        level_order(head);
        in_order(head);
    }
  • 相关阅读:
    利用apktool反编译apk
    CF459E Pashmak and Graph (Dag dp)
    CF919D Substring (dag dp)
    BZOJ 1398: Vijos1382寻找主人 Necklace(最小表示法)
    LUOGU P3048 [USACO12FEB]牛的IDCow IDs(组合数)
    LUOGU P2290 [HNOI2004]树的计数(组合数,prufer序)
    小球放盒子 (组合数总结)
    LUOGU P2294 [HNOI2005]狡猾的商人(差分约束)
    LUOGU P4159 [SCOI2009]迷路(矩阵乘法)
    bzoj 1196: [HNOI2006]公路修建问题(二分+贪心)
  • 原文地址:https://www.cnblogs.com/8023spz/p/8413475.html
Copyright © 2011-2022 走看看