[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