二叉搜索树 数组版参考代码
数据结构定义
struct node{
int data;//结点的内容
int left;//左子树
int right;//右子树
int cnt;
int size;
} Bst[100100];
queue<int> sq;
int root=0;
int tot=0;
更新子树大小:等于左子树+右子树+自身大小
//更新树的大小
void update(int r)
{
Bst[r].size=Bst[Bst[r].left].size+Bst[Bst[r].right].size+Bst[r].cnt;
}
插入
//插入x的值
void insert(int &r,int x)
{
if (r==0)
{
tot=sq.front();
sq.pop();
r=tot;
Bst[tot].data=x;
Bst[tot].left=0;
Bst[tot].right=0;
Bst[tot].cnt=1;
Bst[tot].size=1;
}
else
{
//Bst[r].size++;
if(x>Bst[r].data)
{
insert(Bst[r].right,x);
}
else if(x<Bst[r].data)
{
insert(Bst[r].left,x);
}
else
{
Bst[r].cnt++;Bst[r].size++;
}
}
update(r);
}
查询指定值
int Search(int r,int val)
{
if (r==0) return 0;
if(Bst[r].data>val)
{
return Search(Bst[r].left,val);
}
else if(Bst[r].data==val)
{
return r;
}
else
{
return Search(Bst[r].right,val);
}
}
查询子树的最小值
//查询r子树的最小值的结点编号
int findMin(int r)
{
if (r==0)
{
return 0;
}
else
{
int ans=r;
while(Bst[r].left!=0)
{
ans=Bst[r].left;
r=Bst[r].left;
}
return ans;
}
}
查询子树的最大值
//查询r子树的最大值的结点编号
int findMax(int r)
{
if (r==0)
{
return 0;
}
else
{
int ans=r;
while(Bst[r].right!=0)
{
ans=Bst[r].right;
r=Bst[r].right;
}
return ans;
}
}
第k小值
//第k名的值
int Kth(int r,int k)
{
if(Bst[Bst[r].left].size>=k)
{
return Kth(Bst[r].left,k);
}
else if (Bst[Bst[r].left].size+Bst[r].cnt>=k)
{
return Bst[r].data;
}
else
{
return Kth(Bst[r].right,k-Bst[Bst[r].left].size-Bst[r].cnt);
}
}
查询val的排名
//val的排名
int Rank(int r,int val)
{
int rank=0;
while(r!=0)
{
if (Bst[r].data==val) return rank+Bst[Bst[r].left].size+1;
if (Bst[r].data>val)
{
r=Bst[r].left;
}
else
{
rank+=Bst[Bst[r].left].size+Bst[r].cnt;
r=Bst[r].right;
}
}
return rank+1;
}
统计某个值的个数
int Count(int r,int val)
{
if(r==0) return 0;
if (Bst[r].data==val) return Bst[r].cnt;
else if(Bst[r].data>val) return Count(Bst[r].left,val);
else return Count(Bst[r].right,val);
}
查询前驱
int Pre(int r,int val)
{
int rk=Rank(r,val);
return Kth(r,rk-1);
}
查询后继
//找val的后继
int Sur(int r,int val)
{
int rk=Rank(r,val);
int ck=Count(r,val);
return Kth(r,rk+ck);
}
删除
//删除算法这个算法不是最好可以优化
void Delete(int &r,int val)
{
if (r==0)
{
return ;
}
else if(Bst[r].data==val)
{
if(Bst[r].left==0&&Bst[r].right==0)
{
sq.push(r);
r=0;
return ;
}
else if(Bst[r].left==0) //仅有右子树
{
int y,v;
y=findMin(Bst[r].right);//右子树查最小值
v=Bst[y].data;
Bst[r].data=v;
Bst[r].cnt=Bst[y].cnt;
Bst[r].size=Bst[y].size;
Delete(Bst[r].right,v);
update(r);
}
else //仅有左子树或两个子树
{
int y,v;
y=findMax(Bst[r].left);//左子树查最大值
v=Bst[y].data;
Bst[r].data=v;
Bst[r].cnt=Bst[y].cnt;
Bst[r].size=Bst[y].size;
Delete(Bst[r].left,v);
update(r);
}
}
else if(Bst[r].data>val)
{
Delete(Bst[r].left,val);
update(r);
}
else
{
Delete(Bst[r].right,val);
update(r);
}
}
void DElete(int &r,int val)
{
if (r==0) return ;
if (Bst[r].data==val)
{
Bst[r].cnt--;
Bst[r].size--;
if (Bst[r].cnt==0)
{
Delete(r,val);
}
}
else if(Bst[r].data>val)
{
DElete(Bst[r].left,val);
update(r);
}
else
{
DElete(Bst[r].right,val);
update(r);
}
update(r);
}
浙公网安备 33010602011771号