#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)
【SCAU-数据结构-期末考试】次优查找树
于 2024-06-19 15:24:26 首次发布