zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Ajax省市区无刷新单表联动查询
    Hadoop2.0、YARN技术大数据视频教程
    零基础DNET B/S开发软件工程师培训视频教程
    零基础DNET CS开发视频教程
    HTML5开发框架PhoneGap实战视频教程
    Web前端开发视频教程
    FluentData 轻量级.NET ORM持久化技术详解
    前端 MVVM 框架KnockOut.JS深入浅出视频教程
    ASP.NET Web开发项目实战视频教程
    零基础到CS开发高手通用权限管理系统全程实录
  • 原文地址:https://www.cnblogs.com/littlepage/p/12234188.html
Copyright © 2011-2022 走看看