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 : [email protected]
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
鳴謝
最後
- 由於博主水平有限,不免有疏漏之處,歡迎讀者隨時批評指正,以免造成不必要的誤解!