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


    前言

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

    简介

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

    但是它有些特殊的性质:

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

    如下图:

    一些操作

    遍历

    从小到大输出节点的值

    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

    平衡树是啥 ??

    请听下回分解

  • 相关阅读:
    道德经 剪裁重组版 v1.1
    摸索出来的学习经典的一种方法
    小玩意儿之Gitlab 代码提交日志同步到禅道项目管理系统
    个人职业发展模型
    善小
    学习英文
    物欲
    理解newid()和newsequentialid()
    ubuntu14.04设置静态ip
    .Net 调式案例—实验4 高CPU(High CPU)回顾
  • 原文地址:https://www.cnblogs.com/Arielzz/p/14866085.html
Copyright © 2020-2023  润新知