题目
问题 E: 堆的后序遍历(DS排序)
时间限制: 1 Sec 内存限制: 128 MB
提交: 3 解决: 3
[提交][状态][讨论版]
题目描述
给定一个整数序列, 把它建成最小堆,输出堆的后序遍历
假定序列无重复数字
输入
只有一行,先输入n表示序列包含n个整数,接着输入n个整数
输出
序列转变成最小堆后,输出堆的后序遍历
样例输入
7 49 38 65 97 76 13 27
样例输出
97 76 38 65 49 27 13
代码块
#include <iostream>
using namespace std;
void HeapSort(int i, int n, int *a)
{
int j = 2*i;
while(j<=n)
{
if(j<n && a[j]>a[j+1])
j++;
if(a[j]<a[i])
{
a[0] = a[i];
a[i] = a[j];
a[j] = a[0];
}
i = j;
j = 2*i;
}
}
void PostOrderTraverse(int i, int n, int *a)
{
if(i<=n)
{
PostOrderTraverse(2*i, n, a);
PostOrderTraverse(2*i+1, n, a);
cout<<a[i]<<' ';
}
}
int main(void)
{
int i, n;
cin>>n;
int a[n+1];
for(i=1; i<=n; i++)
cin>>a[i];
for(i=n/2; i>=0; i--)
HeapSort(i, n, a);
PostOrderTraverse(1, n, a);
}