一个无重复的非负整数序列,必定对应唯一的一棵形状为完全二叉树的二叉搜索树。本题就要求你输出这棵树的层序遍历序列。
输入格式:
首先第一行给出一个正整数 N(≤1000),随后第二行给出 N 个不重复的非负整数。数字间以空格分隔,所有数字不超过 2000。
输出格式:
在一行中输出这棵树的层序遍历序列。数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
10
1 2 3 4 5 6 7 8 9 0
输出样例:
6 3 8 1 5 7 9 0 2 4
知识点:
二叉搜索树:它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
完全二叉树:若设二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k 层所有的结点都连续集中在最左边,这就是完全二叉树。
层序遍历:
思路:
有段时间没做这些东西了。。。。。。。。看了半天才看懂。这道题当时也是借鉴了一下
由于二叉搜索树的中序输出为一升序序列,现将数组a[n]升序排列,本题重点在于“完全二叉树”第k 层所有的结点都连续集中在最左边,则说明在左下方一直有元素,而且是数列中最小的。,由递归fun(2*x);//一直求左子树,得知,二叉树左下方编号为x=8,b[x]=1(a[n]中最小值的位置),a[1]=0,编号为8的左子树的根的编号是x=4,b[x]=2(升序排列,根在左子树右边),再推出右子树编号x=9,b[x]=3,以此类推,得出整个二叉树
二叉树:
代码:
#include <bits/stdc++.h>
using namespace std;
int a[1001],b[1001];
int cnt=0,n;
void fun(int x){
if(x>n) return;
fun(2*x);
b[x]=++cnt;
fun(2*x+1);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
fun(1);
for(int i=1; i<=n; i++)
if(i==1)
cout<<a[b[i]];
else
cout<<" "<<a[b[i]];
}