PAT A1099 Build A Binary Search Tree

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
    填词法:
  1. 将结点从小到大排序得到中序序列input[]
  2. 中序遍历“空”树(框架),将得到的中序序列input[],依次填入树中对应位置(也可拿一个额外的数组记录,树中结点id与data的对应关系,如a[2] = 11)
  3. 层序遍历树,输出层序序列
  • 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(" ");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值