静态建树,层数较小
memset(a,-1,sizeof a)//初始化静态数组a,所有值为-1(防止题目有值为0,导致冲突)
void build(){
mm(a,-1);
int x;
for(int i = 0; i < n; i ++ ){
cin >> x;
idx = 1;
while(1){
if(a[idx] == -1){
a[idx] = x;
break;
}else if(x < a[idx]) idx *= 2;
else idx = 2 * idx + 1;
}
}
}
存放二叉搜索树的左右儿子结点,静态建树
int n;
int a[N];
int l[N],r[N];
int d[N],dep = 1;
mm(l,-1);mm(r,-1);
void add(int root,int i,int level){
if(a[i] <= a[root]){
if(l[root] == -1){
l[root] = i;
d[level] ++;
dep = max(level,dep);
return ;
}else add(l[root],i,level + 1);
}else{
if(r[root] == -1){
r[root] = i;
d[level] ++;
dep = max(level,dep);
return ;
}else add(r[root],i,level + 1);
}
}