树
int getmin(int l,int r){
int res=l;
for (int i = l; i <= r; i ++ ){
if(w[res]>w[i]){
res=i;
}
}
return res;
}
void dfs(int l,int r,int d){
if(l>r){//树的必备
return ;
}
int root=getmin(l,r);
level[d].push_back(w[root]);
dfs(l,root-1,d+1);
dfs(root+1,r,d+1);
}
笛卡树
https://www.acwing.com/problem/content/4282/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 40;
int n;
int w[N];
vector<int>level[N];
int getmin(int l,int r){
int res=l;
for (int i = l; i <= r; i ++ ){
if(w[res]>w[i]){
res=i;
}
}
return res;
}
void dfs(int l,int r,int d){
if(l>r){
return ;
}
int root=getmin(l,r);
level[d].push_back(w[root]);
dfs(l,root-1,d+1);
dfs(root+1,r,d+1);
}
int main()
{
cin>>n;
for (int i = 0; i < n; i ++ ){
cin >> w[i];
}
dfs(0,n-1,0);
for (int i = 0; level[i].size(); i ++ ){
for (auto x:level[i]){
cout << x<<" ";
}
}
return 0;
}
bfs
void bfs(int root)
{
int hh = 0, tt = 0;
q[0] = root;
while (hh <= tt)
{
int t = q[hh ++ ];//好处先放左子树还是吸纳放右子树目标倾西
cout << w[t] << ' ';
if (L[t] != -1) q[ ++ tt] = L[t];//l[t] 存的是t结点的左右子树的下标
if (R[t] != -1) q[ ++ tt] = R[t];
}
}