PAT-ADVANCED-1099-Build A Binary Search Tree

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.

    Input Specification:

    Each input file contains one test case. For each case, the first line gives a positive integer N (<=100) 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 N-1, and 0 is always the root. If one child is missing, then -1 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

构造一棵BST树,层序遍历输出。

BST树的中序遍历必然是有序的!我们可以将排序后的数值逐个放入BST树中,而不是去模拟BST调整的过程。

#include <bits/stdc++.h>
#define MAXN 100+50
using namespace std;
struct node{
    int lchild, rchild, key;
}arr[MAXN];
int val[MAXN];
int n;
int cnt = 0;
void solve(int root);
int main(){
    scanf("%d", &n);
    for(int i = 0; i < n; ++i){
        scanf("%d%d", &arr[i].lchild, &arr[i].rchild);
    }
    for(int i = 0; i < n; ++i){
        scanf("%d", &val[i]);
    }
    sort(val, val+n);
    solve(0);
    queue<node> q;
    q.push(arr[0]);
    bool vis = true;
    while(!q.empty()){
        node top = q.front();
        if(vis){
            vis = false;
        }
        else{
            printf(" ");
        }
        printf("%d", top.key);
        q.pop();
        if(top.lchild != -1){
            q.push(arr[top.lchild]);
        }
        if(top.rchild != -1){
            q.push(arr[top.rchild]);
        }
    }
    return 0;
}

void solve(int root){
    if(arr[root].lchild != -1){
        solve(arr[root].lchild);
    }
    arr[root].key = val[cnt];
    cnt++;
    if(arr[root].rchild != -1){
        solve(arr[root].rchild);
    }
}
CAPOUIS'CODE

 

posted @ 2015-09-08 10:16  CAPOUIS  阅读(190)  评论(0)    收藏  举报