这个题目是 完全二叉树和BST的结合,一开始其实我是走了弯路的,后来一看算法笔记的提示,我瞬间想到了利用完全二叉树的特点,即用数组存储树,则左子树=2*root+1,右子树=2 * root+2 此处下标从0开始;
又有BST中序遍历为有序序列,所以只属于逆向完成此过程,逆向中序遍历数组,然后按从小到大存储数据。
附本人AC代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int N, val, index = 0;
vector<int>V, Tree;
void inorder(int x) {
if (x >= N)return;
inorder(2 * x + 1);
Tree[x] = V[index++];
inorder(2 * x + 2);
}
int main() {
scanf("%d", &N);
Tree.resize(N);
for (int i = 0; i < N; i++) {
scanf("%d", &val);
V.push_back(val);
}
sort(V.begin(), V.end());
inorder(0);
for (int i = 0; i < N; i++) {
if (i == 0)printf("%d", Tree[i]);
else printf(" %d", Tree[i]);
}
return 0;
}