Loading

平衡树(一)——二叉搜索树

前言

什么是平衡树 ?? 一种基于二叉查找树的一种数据结构,那啥是二叉查找树捏??

简介

二叉查找树顾名思义,肯定是一棵树哇;

但是它有些特殊的性质:

  • 树中的每个节点都有权值
  • 如果一个节点的左子树不为空,那么左子树上的所有点一定比当前节点都要小
  • 如果一个节点的右子树不为空,那么右子树上的所有点一定比当前节点都要大

如下图:

一些操作

遍历

从小到大输出节点的值

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

平衡树是啥 ??

请听下回分解

平衡树(二)——Treap

posted @ 2021-06-09 11:15  Dita  阅读(64)  评论(0编辑  收藏  举报