PAT A1099 Build A Binary Search Tree
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
- 思路 1:同A 1064
填词法:
- 将结点从小到大排序得到中序序列input[]
- 中序遍历“空”树(框架),将得到的中序序列input[],依次填入树中对应位置(也可拿一个额外的数组记录,树中结点id与data的对应关系,如a[2] = 11)
- 层序遍历树,输出层序序列
- code 1:
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 110;
int n, input[maxn], pre[maxn], idex = 0, cnt = 0;
struct Node{
int data, lc, rc;
}node[maxn];
void inOrder(int root){
if(root == -1) return;
if(node[root].lc != -1) inOrder(node[root].lc);
node[root].data = input[idex++];
if(node[root].rc != -1) inOrder(node[root].rc);
}
void levelOrder(int root){
queue<int> q;
q.push(root);
while(!q.empty()){
int now = q.front();
printf("%d", node[now].data);
if(cnt++ < n-1) printf(" ");
q.pop();
if(node[now].lc != -1) q.push(node[now].lc);
if(node[now].rc != -1) q.push(node[now].rc);
}
}
int main(){
scanf("%d", &n);
for(int i = 0; i < n; ++i) scanf("%d %d", &node[i].lc, &node[i].rc);
for(int i = 0; i < n; ++i) scanf("%d", &input[i]);
sort(input, input+n);
inOrder(0);
levelOrder(0);
return 0;
}
- T2 code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
int in[maxn], idex = 0;
struct Node{
int data, lc, rc;
}node[maxn];
void InOrder(int r){
if(r == -1) return;
InOrder(node[r].lc);
node[r].data = in[idex++];
InOrder(node[r].rc);
}
void Level(int r, int n){
queue<int> q;
q.push(r);
int cnt = 0;
while(!q.empty()){
int now = q.front();
printf("%d", node[now].data);
if(++cnt < n) printf(" ");
q.pop();
if(node[now].lc != -1) q.push(node[now].lc);
if(node[now].rc != -1) q.push(node[now].rc);
}
}
int main(){
int n;
scanf("%d", &n);
for(int i = 0; i < n; ++i){
scanf("%d %d", &node[i].lc, &node[i].rc);
}
for(int i = 0; i < n; ++i){
scanf("%d", &in[i]);
}
sort(in, in + n);
InOrder(0);
Level(0, n);
return 0;
}
- 思路 3: 数组存储法 此题节点数为100,若树的所有节点只有一个孩子(链化),树的高度将极高,比如只有左孩子:数组要开到 (大概 2100 作用,显然开不了这么大的数组),于是样例1, 2挂
于是为了解决爆数组问题,使用set结构压缩,样例1, 2 还是错,才想起来 2100,不仅数组开不了这么大, int 也会溢出,set也没法存
于是解决int溢出问题,采用hash压缩,在结构体中增设level变量,将id压缩为 level * id, AC
【注】真是没事找事a,- -! BFS它不香吗…
- T4 code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
vector<int> in;
struct Node
{
int lc, rc;
}node[maxn];
struct v
{
int data, id, level;
bool operator < (const v & tmp) const
{
return level != tmp.level ? level < tmp.level : id < tmp.id;
}
};
set<v> ans;
void InOrder(int root, int id, int level, int & idex)
{
if(root == -1) return;
if(id > maxn)
{
id = id % maxn;
level++;
}
InOrder(node[root].lc, 2 * id, level, idex);
ans.insert(v{in[idex++], id, level});
InOrder(node[root].rc, 2 * id + 1, level, idex);
}
int main()
{
int n;
scanf("%d", &n);
int r = n * (n - 1) / 2 - (n + 1);
for(int i = 0; i < n; ++i)
{
scanf("%d %d", &node[i].lc, &node[i].rc);
r -= (node[i].lc + node[i].rc);
}
in.resize(n);
for(int i = 0; i < n; ++i)
{
scanf("%d", &in[i]);
}
sort(in.begin(), in.end());
int idex = 0;
InOrder(r, 1, 0, idex);
for(auto it = ans.begin(); it != ans.end(); ++it)
{
if(it == ans.begin()) printf("%d", it->data);
else printf(" %d", it->data);
}
return 0;
}
- 关于BFS:输出时的格式控制可以优化为:省一个变量控制空格输出
while(!q.empty())
{
int now = q.front();
q.pop();
printf("%d", node[now].data);
if(node[now].lc != -1) q.push(node[now].lc);
if(node[now].rc != -1) q.push(node[now].rc);
if(!q.empty()) printf(" ");
}