平衡树(一)——二叉搜索树
前言
什么是平衡树 ?? 一种基于二叉查找树的一种数据结构,那啥是二叉查找树捏??
简介
二叉查找树顾名思义,肯定是一棵树哇;
但是它有些特殊的性质:
- 树中的每个节点都有权值
- 如果一个节点的左子树不为空,那么左子树上的所有点一定比当前节点都要小
- 如果一个节点的右子树不为空,那么右子树上的所有点一定比当前节点都要大
如下图:
一些操作
遍历
从小到大输出节点的值
void Print{
if(!p) return;
Print(left[p]);
Printf(a[p]);
Print(right[p]);
}
查找
int Find(int x, int p) {
if(!p) return 0;//没找到
if(x == a[p]) return p;
else if(x < a[p]) return Find(x, left[p]);
else return Find(x, right);
}
插入节点
void Insert(int x, int &p){
if(!p) p = make_dots(x);//建新点
else if(x < a[p]) Insert(x, left[p]);
else if(x > a[p]) Insert(x, right[p]);
}
删除节点
//删除最小值,并返回最小值
int Delet_Min(int &x) {
if(!left[x]) {
x = right[x];
return a[x];
}
else return Delet_Min(left[x]);
}
//删除权值为 p 的点
void Delet_p(int &x, int p) {
if(a[x] == p) {
if(left[x] && right[x])a[x] = Delet(right[x]);
else x = left[x] ? :left[x]:right[x];
return ;
}
if(a[x] > p) Delet_p(left[x], p);
else Delet_p(right[x], p);
}
上述操作,均摊时间复杂度为 \(log~n\) 但是遇见 1,2,3……9999999 这种友好 鬼畜数据就会被卡到 \(n^2\)
于是平衡树横空出现 /se
平衡树是啥 ??
请听下回分解