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

题目大意

首先给你一颗n个节点BST,再给你n个不同的整数,让你将这n个不同的整数填入BAT中,保证只有一种结果。

题目解析

这道题考点还是建树和树的遍历,这就不提了。

有个坑点是(可能是对我自己来说的坑点):我习惯用数组来记每个数的位置,但是这道题的数据应该有几个是,树的层数比较高,用(i<<1,i<<1+1)表示左右子树可能会超long long,因此最后层序遍历的时候,没有用结构体sort,而用了普遍的广搜就AC了。

#include <cstdio>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cstdlib>
#include <climits>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

#define ll long long
const int MAXN = 1000 + 5;
const int MAXM = 100000 + 5;
const int INF = 0x7f7f7f7f;
const int dir[][2] = {0,1,1,0,0,-1,-1,0};
template <class XSD> inline XSD f_min(XSD a, XSD b) { if (a > b) a = b; return a; }
template <class XSD> inline XSD f_max(XSD a, XSD b) { if (a < b) a = b; return a; }

int n;
struct TREE{
    int l, r;
    int num;
}tree[MAXN];
int a[MAXN], cnt;

void In_order(int root){
    if(tree[root].l!=-1) In_order(tree[root].l);
    tree[root].num=a[cnt++];
    if(tree[root].r!=-1) In_order(tree[root].r);
}

void Solve(){
    ///中序遍历
    In_order(0);
    ///输出
    int ans[MAXN], ct=0;
    queue<int>q;
    q.push(0);
    while(!q.empty()){
        int top=q.front();
        q.pop();ans[ct++]=tree[top].num;
        if(tree[top].l!=-1) q.push(tree[top].l);
        if(tree[top].r!=-1) q.push(tree[top].r);
    }
    for(int i=0; i<ct; i++) printf("%d%c", ans[i], i==(ct-1)?'\n':' ');
}
void Getdata(){
    int x, y;
    for(int i=0; i<n; i++){
        scanf("%d%d", &x, &y);
        tree[i].l = tree[i].r = -1;
        if(x!=-1) tree[i].l=x;
        if(y!=-1) tree[i].r=y;
    }
    cnt=0;
    for(int i=0; i<n; i++) scanf("%d", &a[i]);
    sort(a, a+n);
}
int main(){
    while(~scanf("%d", &n)){
        Getdata();
        Solve();
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值