• 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 (≤) which is the total number of nodes in the tree -- and hence the nodes are numbered from 0 to N1. Then N lines follow, each corresponds to a node from 0 to N1, 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

    反转二叉树,这题我的解法是:直接左子树插入右子树,右子树插入左子树,然后就ok啦,之后我们进行层序和中序即可。

    #include "iostream"
    #include "vector"
    #include "string"
    #include "queue"
    using namespace std;
    int N;
    string tmp_l, tmp_r;
    struct node {
        int data, left = -1, right = -1, level;
    };
    vector<node> v;
    void levelorder(int root) {
        bool start = true;
        queue<node> que;
        que.push(v[root]);
        while(!que.empty()) {
            node n = que.front();
            if(start) {
                printf("%d", n.data);
                start = false;
            } else printf(" %d", n.data);
            que.pop();
            if(n.left != -1) que.push(v[n.left]);
            if(n.right != -1) que.push(v[n.right]);
        }
    }      
    bool start = true;
    void inorder(int root) {
        if(v[root].left != -1) inorder(v[root].left);
        if(start) {
            start = !start;
            printf("%d", v[root].data);
        } else printf(" %d", v[root].data);
        if(v[root].right != -1) inorder(v[root].right);
    }
    int main() {
        scanf("%d", &N);
        v.resize(N);
        vector<bool> judge(N, false);
        for(int i = 0;i < N; i++) {
            cin >> tmp_l >> tmp_r;
            v[i].data = i;
            if(tmp_l != "-") {
                v[i].right = stoi(tmp_l);
                judge[stoi(tmp_l)] = true;
            }
            if(tmp_r != "-") {
                v[i].left = stoi(tmp_r);
                judge[stoi(tmp_r)] = true;
            }
        }
        int root_index;
        for(int i = 0; i < N; i++)
            if(judge[i] == false) root_index = i;
        levelorder(root_index);
        putchar('
    ');
        inorder(root_index);
        return 0;
    }
  • 相关阅读:
    python——scrapy的三种登录方式,下载中间件(Downloademiddleware),settings文件
    PHPExcel探索之旅---阶段四 导入文件
    PHPExcel探索之旅---阶段三 绘制图表
    PHPExcel探索之旅---阶段二 设置表格样式
    PHPExcel探索之旅---阶段一
    PDO中构建事务处理的应用程序
    对图片进行翻转
    用给定的角度旋转图像
    为背景图像添加图像水印(位置随机)
    对图片进行缩放
  • 原文地址:https://www.cnblogs.com/littlepage/p/12900539.html
Copyright © 2020-2023  润新知