【PAT】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.

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

做这种题,先画图!!
然后看规律!!!
可以发现中序遍历的结果是从小到大的,这个规律很重要
我们把原序列sort一下,按照中序遍历的顺序存进去
然后从根节点bfs一下,答案就出来了

#include <bits/stdc++.h>
using namespace std;
struct node
{
    int left;
    int right;
    int data;   
}tree[100100];
int b[110000];
int n;
int cnt=1;
void build(int x){//中序遍历,存放值
    if(tree[x].left!=-1){
        build(tree[x].left);
    }
    tree[x].data=b[cnt++];
    // printf("%d [%d]\n",tree[x].data,x );
    if(tree[x].right!=-1){
        build(tree[x].right);
    }
}
int flag=0;
void level(int x){//层序遍历 用队列实现就可以啦
    queue <int> q;
    q.push(x);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        if(!flag){
            printf("%d",tree[u].data );
            flag=1;
        }
        else{
            printf(" %d",tree[u].data);
        }
        if(tree[u].left!=-1) q.push(tree[u].left);
        if(tree[u].right!=-1) q.push(tree[u].right);
    }
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        int a,b;
        cin>>a>>b;
        tree[i-1].left=a;//建树
        tree[i-1].right=b;
    }
    for(int i=1;i<=n;i++){
        cin>>b[i];
    }
    sort(b+1,b+1+n);//排序 默认从小到大
    build(0);
    level(0);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38677814/article/details/80905101