IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> PTA甲级 1102 Invert a Binary Tree (C++) -> 正文阅读

[C++知识库]PTA甲级 1102 Invert a Binary Tree (C++)

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

Solution:

// Talk is cheap, show me the code
// Created by Misdirection 2021-08-24 21:30:09
// All rights reserved.

#include <iostream>
#include <vector>
#include <unordered_map>
#include <queue>

using namespace std;

vector<pair<int, int>> input;
vector<int> levelOrder, midOrder;

struct Node{
    int key;
    Node *left;
    Node *right;

    Node(int k = -1, Node *l = NULL, Node *r = NULL){
        key = k;
        left = l;
        right = r;
    }
    ~Node(){}
};

void findChildren(Node *root){
    if(root == NULL) return;

    if(input[root -> key].first != -1) root -> left = new Node(input[root -> key].first, NULL, NULL);
    if(input[root -> key].second != -1) root -> right = new Node(input[root -> key].second, NULL, NULL);

    findChildren(root -> left);
    findChildren(root -> right);
}

void midTraverse(Node *root){
    if(root -> left != NULL) midTraverse(root -> left);
    midOrder.push_back(root -> key);
    if(root -> right != NULL) midTraverse(root -> right);
}

int main(){
    int n;
    scanf("%d", &n);

    int r;
    unordered_map<int, int> flag;
    input.clear();
    levelOrder.clear();
    midOrder.clear();
    
    for(int i = 0; i < n; ++i){
        string a, b;
        cin >> a >> b;

        int left, right;

        if(a == "-") left = -1;
        else left = stoi(a);

        if(b == "-") right = -1;
        else right = stoi(b);

        flag[left] = flag[right] = 1;
        input.emplace_back(right, left);
    }

    for(int i = 0; i < n; ++i){
        if(flag[i] == 0){
            r = i;
            break;
        }
    }

    Node *root = new Node(r, NULL, NULL);
    findChildren(root);

    queue<Node*> q;
    q.push(root);

    while(!q.empty()){
        levelOrder.push_back(q.front() -> key);
        if(q.front() -> left != NULL) q.push(q.front() -> left);
        if(q.front() -> right != NULL) q.push(q.front() -> right);

        q.pop();
    }

    for(int i = 0; i < n; ++i){
        if(i == n - 1) printf("%d\n", levelOrder[i]);
        else printf("%d ", levelOrder[i]);
    }

    midTraverse(root);
    for(int i = 0; i < n; ++i){
        if(i == n - 1) printf("%d\n", midOrder[i]);
        else printf("%d ", midOrder[i]);
    }

    return 0;
}

在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 12:01:58  更:2021-08-25 12:02:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 5:50:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计