#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
int n,a[55],b[55],c[55];
//a储存原始数据,b储存前n位之和,c储存左右两侧和差
//boot储存根序列号
void solve(int l,int r)
{
if(l>=r)//只剩下一个元素的时候输出
{
cout<<a[l]<<' ';
return;
}
else
{
int boot;
if(l>0)//除了第一次遍历(init计算过c数组),都需要重新计算c数组
{
for(int i=r; i>=l; i--)
{
int rsum=b[r]-b[i];
int lsum=b[i-1]-b[l-1];
c[i]=abs(rsum-lsum);
}
}
//找到最小根然后先序遍历递归
boot=min_element(c+l,c+r+1)-c;
cout<<a[boot]<<' ';
if(boot!=l) solve(l,boot-1);
if(boot!=r) solve(boot+1,r);
return;
}
}
void init()//初始化b数组,c数组
{
b[0]=a[0];//特殊处理b[0]
for(int i=1; i<n; i++) b[i]=b[i-1]+a[i];//初始化b数组
c[0]=b[n-1]-b[0];//特殊处理c[0]
for(int i=n-1; i>=1; i--)//初始化c数组
{
int rsum=b[n-1]-b[i];
int lsum=b[i-1];
c[i]=abs(rsum-lsum);
}
}
int main()
{
cin>>n;
for(int i=0; i<n; i++) cin>>a[i];
init();
solve(0,n-1);
return 0;
}
【SCAU-数据结构-期末考试】次优查找树
于 2024-06-19 15:24:26 首次发布