• PAT Advanced 1099 Build A Binary Search Tree (30分)


    A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:

    • The left subtree of a node contains only nodes with keys less than the node's key.
    • The right subtree of a node contains only nodes with keys greater than or equal to the node's key.
    • Both the left and right subtrees must also be binary search trees.

    Given the structure of a binary tree and a sequence of distinct integer keys, there is only one way to fill these keys into the tree so that the resulting tree satisfies the definition of a BST. You are supposed to output the level order traversal sequence of that tree. The sample is illustrated by Figure 1 and 2.

    figBST.jpg

    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. The next N lines each contains the left and the right children of a node in the format left_index right_index, provided that the nodes are numbered from 0 to N1, and 0 is always the root. If one child is missing, then − will represent the NULL child pointer. Finally N distinct integer keys are given in the last line.

    Output Specification:

    For each test case, print in one line the level order traversal sequence of that tree. All the numbers must be separated by a space, with no extra space at the end of the line.

    Sample Input:

    9
    1 6
    2 3
    -1 -1
    -1 4
    5 -1
    -1 -1
    7 -1
    -1 8
    -1 -1
    73 45 11 58 82 25 67 38 42
    
     

    Sample Output:

    58 25 82 11 38 67 45 73 42

    这题考察了给定左子树,右子树,然后再给出数字,按照给定进行构建树,最后输出层序遍历。

    我们先对其进行排序,就是中序的结果。

    我们仅需要在构建的时候,进行加一个level进行代表层级,用一个index代表索引,然后利用level和index进行排序即可。

    最后按次序输出就是所得结果

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    struct node {
        int index, val, left, right, level;
    };
    bool cmp(node& n1, node& n2){
        return n1.level == n2.level ? n1.index < n2.index: n1.level < n2.level;
    }
    int N;
    vector<node> v;
    vector<int> data;int k = 0;
    void inorder(int root, int index, int level){
        if(v[root].left != -1) inorder(v[root].left, 2 * index + 1, level + 1);
        v[root] = {index, data[k++], v[root].left, v[root].right, level};
        if(v[root].right != -1) inorder(v[root].right, 2 * index + 2, level + 1);
    }
    int main(){
        cin >> N;
        v.resize(N);
        data.resize(N);
        for(int i = 0; i < N; i++)
            cin >> v[i].left >> v[i].right;
        for(int i = 0; i < N; i++)
            cin >> data[i];
        sort(data.begin(), data.end());
        inorder(0, 0, 0);
        sort(v.begin(), v.end(), cmp);
        cout << v[0].val;
        for(int i = 1; i < N; i++)
            cout << " " << v[i].val;
        system("pause");
        return 0;
    }
  • 相关阅读:
    Java:Excel文件上传至后台
    JDK1.8中的HashMap实现
    Redis远程连接报错解决
    Redis操作命令总结
    HashMap实现原理及源码分析
    谈谈对Spring IOC的理解
    centos 7.3 服务器环境搭建——MySQL 安装和配置
    Linux系统下 docker安装命令
    JS求两个数组的交集 (假设数组已经经过排序)
    作用域和作用域链
  • 原文地址:https://www.cnblogs.com/littlepage/p/12234188.html
Copyright © 2020-2023  润新知