Problem
求能够生成题目中给的生成二叉查找树的生成序列中字典序最小的
Solution
最小的显然是把这个二叉查找树生成以后的中序遍历
然后我们不能直接插入生成二叉查找树啊…会被卡…
方法一:平横树
记录有什么树即他的位置,然后查前驱后继,直接连即可
方法二:笛卡尔树
O
(
n
)
O(n)
O(n) 建立笛卡尔树…
代码如下…
Code
#include <cstdio>
#include <algorithm>
using namespace std;
#define N 100010
int n,top,s[N],v[N],ch[N][2];
struct node{
int x,id;
bool operator < (const node&y) const{
return x<y.x;
}
}a[N];
void dfs(int p){
if(!p) return;
printf("%d ",v[p]);
dfs(ch[p][0]);dfs(ch[p][1]);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i].x),a[i].id=i;
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
while(top && a[s[top]].id>a[i].id) top--;
v[i]=a[i].x;
ch[i][0]=ch[s[top]][1];
ch[s[top]][1]=i;
s[++top]=i;
}
dfs(ch[0][1]);
return 0;
}