1. 预备知识
    1. 深度:根节点为0,从叶子到根节点最长的路径
    2. 先序遍历:为节点标记深度
    3. 中序遍历:查找二叉树的输出
    4. 后序遍历:计算树的深度
  2. 二叉树
    1. 构造表达树:将后缀表达式转换成表达树
      1. 如果符号是数字,进栈;
      2. 如果符号是操作符,则弹出两个数字,作为左右节点,根节点为操作符
      3. 再把这棵树进栈
    2. 二叉查找树:左节点小于根节点,根节点小于右节点
      1. 关于查找某一个节点是否存在,可以通过不断与根节点比较,利用二叉查找树的特性,判断是查左节点还是右节点,还是本节点就是要查找的结点,也算是二分查找的本质
      2. 查找最大值或最小值。最左节点就是最小值,最右节点就是最大值
      3. 插入某一个节点,跟查找很像,就是在不断判断属于左子树还是右子树,属于之后,当节点为null,那么本节点就插在这个位置
        1. 由于二叉查找树不予许有重复的值,那么如果该节点存在就无需操作
      4. 删除的策略
        1. 如果是叶子就直接删除
        2. 如果只有一个儿子,就把他的父亲指向他的独子
        3. 如果有两个则,寻找右子树的最小节点,也就是右子树的最左子树来替换这个节点,将节点的数据复制到要删除的结点,替换他,再删除最小的那个节点,也就是最小节点的右子树顶上
        4. 懒惰删除策略:不删除,只是标记不使用
      5. 使用中序遍历可以将二叉查找树排序输出
    3. AVL平衡查找树:平衡条件每个节点左右子树高度小于等于1
      1. 不改变树结构的操作可直接使用标准二叉查找树的程序
      2. 主要改变树结构后恢复起来复杂,特别是删除
      3. 对插入破坏平衡条件靠旋转来简单调整
        1. 寻找失去平衡的最深节点
        2. 对外边情况导致的失去平衡,(左左,右右的情况),通过单旋转调整
          1. 抽象的认为抓住那个节点使他在重力下自动下垂,再把接上去
        3. 对内边情况,(左右,右左)双旋转
    4. 伸展树·比平衡二叉查找树的调整简单点,节点可以达到任意深度
      1. 本质,当一个节点被访问后,经过一系列的AVL树的旋转被推到根上
      2. 许多应用中一个节点被访问后不久将再被访问
      3. 通过展开,在旋转的同时降低深度,在旋转中填补null
    5. B树:M叉排序树,
      1.  
      2. 主要操作是分裂
      3. B+树:M阶平衡树,Mysql索引的核心(M为磁盘页大小)
        1. M阶B+树特性
          1. 数据存储在叶子上,叶子结点相连(双向链表),数据和节点一样多
          2. 非叶子存储直到M-1个关键字以指示搜索方向;关键字i代表子树i-1的最小关键字
          3. 树的根可能是叶子,也可能他的儿子树在2和M之间
          4. 除了根之外,所有非叶子节点的儿子树在M/2到M之间
          5. 所有叶子都在相同深度上并有L/2和L之间个数据项
    6. 标准库中的集合和映射
      1. Set接口:不允许有重复元素                        
        1. SortedSet给出一种特殊类型的Set,保证各项处于有序状态 
        2. 保持各项有序的set的实现是TreeSet
      2. 关于Map接口:键值对
        1. 关键字是唯一的,但不同的关键字可以映射到同一个值
        2. SortedMap接口的一种实现是TreeMap类
        3. 不提供迭代器
      3. TreeMap和TreeSet类的实现
        1. 使用自顶向下的红黑树实现
    7. 红黑树:AVL的一种流行变种
      1. 具有着色性质的二叉查找树:条件
        1. 每个节点不是红就是黑,
        2. 根节点为黑
        3. 如果一个节点是红色,那么它的子节点就是黑色
        4. 从一个节点到一个null节点的引用(也就是看不见的节点)的每一条路径,必须包含相同数目的黑色节点
      2. 高度最多是2log(N+1),因此查找操作最多是一种对数操作
      3. 平衡操作:变颜色,左旋,右旋
      4. 新加入的节点总是红色的
        1. 因为被插入前的树结构是构建好的,一但我们进行添加黑色的节点,无论添加在哪里都会破坏原有路径上的黑色节点的数量平等关系,所以插入红色节点是正确的选择。 若是黑色就违反条件4
        2. 若父节点为红,那么就会违背条件3,这时就需要进行颜色的改变和树的旋转(红黑树基本操作)
      5. 插入:(新元素为红色)
        1. 自底向上插入
          1. 新插入项的父亲是黑色,就直接插入
          2. 父亲是红色:
            1. 叔叔是红色:
              1. 父亲和叔叔变黑
              2. 爷爷变红
              3. 指针定位到爷爷节点,进行判断是否还需平衡操作
            2. 兄弟是黑色,当前是红色,且是右子树
              1. 左旋:操作:自己,父亲,左儿子
              2. 当前往上提,父亲往下左移,做儿子,过继给父亲做右儿子
            3. 兄弟是黑色,当前是红色,且是左子树
              1. 右旋:操作父亲、爷爷、兄弟
              2. 父亲向上提,爷爷向下右移,两者颜色改变,兄弟变成爷爷的左儿子
          3.  
  3.  
 
    
 
posted @ 2020-07-12 23:40  浪波激泥  阅读(110)  评论(0编辑  收藏  举报