题目大意
给一个无重复的数字序列,则这个序列可以构成一颗唯一的完全二叉搜索树,要求输出这个完全二叉搜索树的中序遍历
输入
每组包含一个测试用例
- 第一行是一个正整数 N ≤ 1000 N\leq1000 N≤1000表示有 N N N个不重复的数字
- 第二行是 N N N个不重复的数字
输出
对每个测试用例,在一行中输出这个完全二叉搜索树的中序遍历
样例输入
10
1 2 3 4 5 6 7 8 9 0
样例输出
6 3 8 1 5 7 9 0 2 4
解析
由于是一颗完全的二叉搜索树,所以我们先将输入的序列排序,则排完序之后的序列就是这个完全二叉搜索树的中序遍历,接下来就是不断递归求根节点。因为在层次遍历中,如果根节点的索引是index
,那么左子树的根节点的索引就是index*2+1
,右子树的根节点的索引就是index*2+2
,所以求根就是关键。
- 由于是完全二叉搜索树,那么左子树的所有节点都小于根节点,且左子树的节点数要不小于右子树的节点数。
- 求根的问题就变成了求左子树的节点数的问题,这样问题就简化了很多。如何求左子树的节点数,其实画下完全二叉搜索树的图就明白了
# -*- coding: utf-8 -*-
# @Time : 2019/6/25 10:48
# @Author : ValarMorghulis
# @File : 1064.py
from math import log
ans = list()
a=list()
def level(s, e, index):
if s > e:
return
global ans
tot = e - s + 1
l = int(log(tot + 1) / log(2))
leaves = tot - 2 ** l + 1
root = s + min(leaves, 2 ** (l - 1)) + 2 ** (l - 1) - 1
ans[index]=a[root]
level(s, root - 1, index*2+1)
level(root + 1, e, index*2+2)
def solve():
global ans, a
n = int(input())
ans = [0 for i in range(n)]
a = list(map(int, input().split()))
a.sort()
level(0, n - 1, 0)
print(*ans)
if __name__ == "__main__":
solve()