二叉排序树有一个性质:
- 中序遍历得到的序列是有序序列
所以将题目给定的序列排好序,然后将一个所有结点值为空的完全二叉排序树进行中序遍历(该完全二叉树还未建立,但是数组是存在的,所以每一个结点都是存在的),把中序遍历中每一个结点的值按照排序好的有序序列的顺序一一赋值,这样一颗完全二叉树就建立好了!
而对完全二叉树数组进行顺序遍历就是对完全二叉树进行中序遍历
# include <bits/stdc++.h>
using namespace std;
/* 二叉排序树有一个性质:中序遍历得到的序列是有序序列
所以将题目给定的序列排好序,然后将一个所有结点值为空的完全二叉排序树进行中序遍历,
把遍历中每一个结点的值按照排序好的有序序列的顺序赋值,这样一颗完全二叉树就建立好了!
对完全二叉树数组进行顺序遍历就是对完全二叉树进行中序遍历
*/
int A[1010];
int CBT[1010];
int N;
int idx = 0;
void inOrder(int root){
// 中序遍历给结点赋值
if(root > N) return;
inOrder(root*2); // 左子树
CBT[root] = A[idx++]; // 给结点赋值
inOrder(root*2 + 1); // 右子树
}
int main(){
cin >> N;
for(int i =0;i < N;++i)
scanf("%d", &A[i]);
sort(A, A+N);
inOrder(1);
for(int i = 1;i <= N;++i)
cout << CBT[i] << (i == N?"\n":" ");
return 0;
}