PAT(Advanced)1064 Complete Binary Search Tree C++实现
题目链接
1064 Complete Binary Search Tree
题目大意
给定没有相同元素的非负整数序列,构造其完全二叉排序树并输出层次遍历序列,完全二叉排序树即为同时满足二叉排序树和完全二叉树要求的二叉树
算法思路
中序遍历构造完全二叉搜索树,保证叶子节点集中在最后一层左边,满足完全二叉树定义,根据二叉搜索树定义,中序遍历序列递增有序。每次递归到底选取优先级队列关键字最大的元素,先遍历右子树,再遍历左子树,这样“逆中序”遍历可以不用改动C++STL优先队列的优先级,默认为最大堆,使序列从后到前递减有序,即从前到后递增有序,输出层次遍历得到的序列
void CBT::levelTraverse(int p) {
if (p >= levelSequence.size()) {
return;
}
levelTraverse(2 * p + 1);
levelSequence[p] = sequence.top();
sequence.pop();
levelTraverse(2 * p);
}
AC代码
/*
author : eclipse
email : eclipsecs@qq.com
time : Sun Jun 21 18:46:26 2020
*/
#include <bits/stdc++.h>
using namespace std;
class CBT {
private:
priority_queue<int> sequence;
vector<int> levelSequence;
void levelTraverse(int p);
public:
CBT(vector<int> v);
void printLevelSequence();
};
CBT::CBT(vector<int> v) {
levelSequence.resize(v.size() + 1);
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
sequence.push(*it);
}
levelTraverse(1);
}
void CBT::levelTraverse(int p) {
if (p >= levelSequence.size()) {
return;
}
levelTraverse(2 * p + 1);
levelSequence[p] = sequence.top();
sequence.pop();
levelTraverse(2 * p);
}
void CBT::printLevelSequence() {
vector<int>::iterator it = levelSequence.begin();
printf("%d", *(++it));
while (++it != levelSequence.end()) {
printf(" %d", *it);
}
}
int main(int argc, char const *argv[]) {
int N;
scanf("%d", &N);
vector<int> v;
for (int i = 0; i < N; i++) {
int value;
scanf("%d", &value);
v.push_back(value);
}
CBT *cbt = new CBT(v);
cbt->printLevelSequence();
return 0;
}
样例输入
10
1 2 3 4 5 6 7 8 9 0
样例输出
6 3 8 1 5 7 9 0 2 4
鸣谢
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!