1. 程式人生 > >PAT 甲級 1099 Build A Binary Search Tree

PAT 甲級 1099 Build A Binary Search Tree

https://pintia.cn/problem-sets/994805342720868352/problems/994805367987355648

 

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 Nlines 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

程式碼:

#include <bits/stdc++.h>
using namespace std;

int N;

struct Node{
    int data;
    int l, r;
}node[110];

vector<int> v;
int ans = 0;

void inorder(int root) {
    if(root == -1) return ;

    inorder(node[root].l);
    node[root].data = v[ans ++];
    inorder(node[root].r);
}

void levelorder(int root) {
    queue<int> q;
    if(root != -1) q.push(root);
    bool isfirst = true;

    while(!q.empty()) {
        int t = q.front();
        q.pop();

        if(isfirst) {
            printf("%d", node[t].data);
            isfirst = false;
        }
        else printf(" %d", node[t].data);

        if(node[t].l != -1) q.push(node[t].l);
        if(node[t].r != -1) q.push(node[t].r);
    }
}

int main() {
    scanf("%d", &N);
    for(int i =0; i < N; i ++)
        scanf("%d%d", &node[i].l, &node[i].r);
    v.resize(N);
    for(int i = 0; i < N; i ++)
        scanf("%d", &v[i]);
    sort(v.begin(), v.end());
    inorder(0);
    levelorder(0);
    return 0;
}

  這這這 應該是學會建樹了叭 unbelieveable 有一點點雞凍 

強行 cue FH