[PAT解题报告] Build A Binary Search Tree

给定树结构,和一些整数,把这些整数填写到树结构中,恰好形成BST (Binary Search Tree)。BST的定义已经给定就是左边节点的值都比它小,右边的值都不比它小。
其实也不难,二叉树的形态已经知道了,我们先把二叉树建立起来而不管节点上的值。输入给了每个节点的左右孩子,我们自然就有了树结构。问题是如何生成BST呢?怎么才能把数填进去?
BST的关键是中序遍历之后得到的数是有序的。 那么我们自然可以把所有的树排序,再中序遍历顺便填上这些数——按照由小到大的顺序填就可以,关键是中序遍历告诉我们这些节点访问的顺序了。 另外一种方法就是,统计出每个节点左孩子子树的个数——这样也就变相地知道这个数应该填几了。
构造好树以后,输出是层序遍历的结果。那么一个可以用一个显然的bfs, 用队列就可以一层一层地访问出所有节点,直接输出就可以了。

代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>

using namespace std;


int left[105];
int right[105];
int a[105];
int b[105];
queue<int> q;

void dfs(int now, int &x) {
    if (now < 0) {
        return;
    }
    dfs(left[now], x);
    b[now] = a[x++];
    dfs(right[now], x);
}

int main() {
int n;
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        scanf("%d%d",&left[i], &right[i]);
    }
    for (int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
    }
    sort(a, a + n);
    dfs(0, n = 0);      
    bool mark = false;
    for (q.push(0); !q.empty(); q.pop()) {
        if (mark) {
            putchar(' ');
        }
        else {
            mark = true;
        }
        int x = q.front();
        printf("%d", b[x]);
        if (left[x] >= 0) {
            q.push(left[x]);
        }
        if (right[x] >= 0) {
            q.push(right[x]);
        }
    }
    puts("");
    return 0;
}

原题链接: http://www.patest.cn/contests/pat-a-practise/1099
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务