疑问
暂无
代码
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1010;
//由于是完全二叉树,所以我们可以这样写
int bst[maxn];
//存储输入
int input[maxn];
//当前写入排名第几的结点
int k=0;
//总共有多少输入
int n;
void inOrder(int root){
if(root>n){
return;
}else{
inOrder(2 * root);
bst[root] = input[k++];
inOrder(2 * root + 1);
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&input[i]);
}
sort(input,input+n);
inOrder(1);
for(int i=1;i<=n;i++){
printf("%d%c",bst[i],i!=n?' ':NULL);
}
return 0;
}
反思
- 解题需要结合静态实现的完全二叉树的性质和BST的中序遍历的性质。
二刷代码
//模拟进行中序遍历
//数组下标从1开始
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1010;
int n;
int data[maxn];
int tree[maxn];
int idx=1;
void inOrder(int root){
if(root>n){//说明超出范围了
return;
}else{
inOrder(root*2);
tree[root]=data[idx];
idx++;
inOrder(root*2+1);
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&data[i]);
}
//排序
sort(data+1,data+n+1);
//接下来进行中序遍历数组
inOrder(1);
//得到的结果就是层序结果
for(int i=1;i<=n;i++){
printf("%d",tree[i]);
if(i!=n){
printf(" ");
}
}
return 0;
}