PAT甲级--Build A Binary Search Tree (30)
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT甲级--Build A Binary Search Tree (30)相关的知识,希望对你有一定的参考价值。
更多PAT甲级详解– acking-you.github.io
题目
题目大意
文章文字那么长,主要就掌握三点:
- 输入给到二叉搜索树的树形结构。
- 给出一堆数据填入这些结点中,使其满足二叉搜索树。
- 按层序遍历输出二叉搜索树的数据。
- 好了,我们清楚了这三点后,我们最关键的就在于怎么把这棵树填充成二叉搜索树?
由于二叉搜索树的性质,它的中序遍历正好就是从小到大的序列,诶!这不正好可以利用这个性质来赋值吗?我们直接把给的数据排序,然后根据中序遍历的顺序进行赋值即可!
代码详解
输入输出前的准备
所需变量:
int N;
int* nums; //用于动态分配掌握全局
int tot = 0;//游标用于赋值
queue<int>Q;//用于层序遍历输出答案
struct node { //每个树的结点(其实也可以设为动态
int val, l, r;
node(): val(0), l(-1), r(-1) {}
} Treenode[101];
输入的处理
Input函数
//@输入处理
void Input() {
ios::sync_with_stdio(false);
cin >> N;
for (int i = 0; i < N; i++) { //由图中可知,这个左右子树编号正好是根据这个序号来给的
cin >> Treenode[i].l >> Treenode[i].r;
}
nums = new int[N];//申请内存存储每个结点的值
for (int i = 0; i < N; ++i) {
cin >> nums[i];
}
sort(nums, nums + N); //由于我们已经知道二叉搜索树的树形结构,而它的值是遵循中序遍历递增的规律的
}
输出的处理
//@中序赋值
void Inorder(int node) {
if (node == -1)
return;
Inorder(Treenode[node].l);//左子树
Treenode[node].val = nums[tot++];
Inorder(Treenode[node].r);//右子树
}
//@BFS打印
void print() {
Q.push(0);
while (!Q.empty()) {
int node = Q.front(); Q.pop();
if (Treenode[node].l != -1)
Q.push(Treenode[node].l);
if (Treenode[node].r != -1)
Q.push(Treenode[node].r);
cout << Treenode[node].val;
if (!Q.empty())
cout << ' ';
}
}
整合代码提交
效率还行!
#include <bits/stdc++.h>
using namespace std;
//利用二叉搜索树的性质--中序遍历的序列是递增序列
int N;
int *nums;
int tot = 0;//游标用于赋值
queue<int> Q;//用于最后层序遍历输出答案
struct node {
int val, l, r;
node() : val(0), l(-1), r(-1) {}
} Treenode[101];
//@输入处理
void Input() {
ios::sync_with_stdio(false);
cin >> N;
for (int i = 0; i < N; i++) {//由图中可知,这个左右子树编号正好是根据这个序号来给的
cin >> Treenode[i].l >> Treenode[i].r;
}
nums = new int[N];//申请内存存储每个结点的值
for (int i = 0; i < N; ++i) {
cin >> nums[i];
}
sort(nums, nums + N);//由于我们已经知道二叉搜索树的树形结构,而它的值是遵循中序遍历递增的规律的
}
//@中序赋值
void Inorder(int node) {
if (node == -1)
return;
Inorder(Treenode[node].l);//左子树
Treenode[node].val = nums[tot++];
Inorder(Treenode[node].r);//右子树
}
//@BFS打印
void print() {
Q.push(0);
while (!Q.empty()) {
int node = Q.front();
Q.pop();
if (Treenode[node].l != -1)
Q.push(Treenode[node].l);
if (Treenode[node].r != -1)
Q.push(Treenode[node].r);
cout << Treenode[node].val;
if (!Q.empty())
cout << ' ';
}
}
int main() {
Input();
Inorder(0);
print();
return 0;
}
以上是关于PAT甲级--Build A Binary Search Tree (30)的主要内容,如果未能解决你的问题,请参考以下文章
PAT甲级1099 Build A Binary Search Tree (30 分)
PAT 甲级1151 LCA in a Binary Tree (30 分)
PAT(甲级)2019年春季考试 7-4 Structure of a Binary Tree
PAT甲级——1110 Complete Binary Tree (完全二叉树)