数据结构 树 二叉树 二叉搜索树 平衡二叉搜索树 红黑树 B树 B+树

博文目录

文章目录

  • 二叉树
    • 遍历
  • 二叉搜索树/二叉查找树/二叉排序树
    • 遍历
    • 最小最大值
    • 前驱后继结点
      • 后继节点
      • 前驱节点
    • 查找
    • 插入
    • 删除
      • 方式一: 操作节点
      • 方式二: 替换子树
    • 时间复杂度
  • 平衡二叉搜索树
  • 红黑树


树、二叉树、二叉搜索树、红黑树、B树等概念
数据结构之二叉树的前序遍历、中序遍历、后序遍历、层序遍历
整理得吐血了,二叉树、红黑树、B&B+树超齐全,快速搞定数据结构
浅谈数据结构-二叉树
数据结构与算法

它是由n(n>0)个有限节点组成一个具有层次关系的集合

  • 无序树: 树中任意节点的子节点之间没有顺序关系,也称自由树
  • 有序树: 树中任意节点的子节点之间有顺序关系
  • 节点的度:一个节点含有的子树的个数称为该节点的度
  • 树的度:一棵树中,最大的节点的度称为树的度
  • 叶节点或终端节点:度为零的节点
  • 非终端节点或分支节点:度不为零的节点
  • 父亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点
  • 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点
  • 兄弟节点:具有相同父节点的节点互称为兄弟节点
  • 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推
  • 树的高度或深度:树中节点的最大层次
  • 堂兄弟节点:父节点在同一层的节点互为堂兄弟
  • 节点的祖先:从根到该节点所经分支上的所有节点
  • 子孙:以某节点为根的子树中任一节点都称为该节点的子孙
  • 森林:由m(m>=0)棵互不相交的树的集合称为森林

二叉树

二叉树是一种特殊的有序树,每个节点至多有两个分支(子节点),分支具有左右次序,不能颠倒。

  • 满二叉树:每一层都是满的。
  • 完全二叉树:除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干节点(注意是右边,而不能是左边缺少)

遍历

  • 前序遍历:根-左-右, 每读一个节点都需要来一遍根左右, 有递归的意思, 根据前序遍历的结果可知第一个访问的必定是root结点
  • 后序遍历:左-右-根, 根据后序遍历的结果可知最后访问的必定是root结点
  • 中序遍历:左-根-右, 根据中序遍历的结果,再结合前序/后序遍历的root结点去划分root结点的左右子树
  • 层序遍历:从左到右, 从上到下, 第一个访问的必定是root结点

原则:永远从左往右数
数据结构 树 二叉树 二叉搜索树 平衡二叉搜索树 红黑树 B树 B+树_第1张图片
前序遍历:ABDHIEJCFKG
中序遍历:HDIBEJAFKCG
后序遍历:HIDJEBKFGCA
层序遍历:ABCDEFGHIJK

二叉搜索树/二叉查找树/二叉排序树

《算法导论笔记》——十分钟带你了解二叉搜索树(BST)!

二叉搜索树(Binary Search Tree, BST),是指一棵空树或者具有下列性质的二叉树:

  • 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值
  • 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值
  • 任意节点的左、右子树也分别为二叉查找树
  • 每个节点的键都不重复(这个很重要, 如果允许重复的话, 搜索插入删除操作会很难定义, 不好用代码实现)

简单来说, 二叉搜索树就是有序的二叉树, 左小右大, 且键不重复

二叉查找树的优势在于查找、插入的时间复杂度较低,n为节点数,期望O(logn),平衡二叉树,最坏为O(n),斜树,可认为是链表

遍历

同二叉树

最小最大值

最小值: 根节点往左一直找, 直到某个没有左子树的结点, 该节点就是当前树的最小结点
最大值: 根节点往右一直找, 直到某个没有右子树的结点, 该节点就是当前树的最大结点

前驱后继结点

中序遍历时, 某结点的前后节点
数据结构 树 二叉树 二叉搜索树 平衡二叉搜索树 红黑树 B树 B+树_第2张图片

后继节点

  • 当前节点有右子树: 当前节点的后继节点就是其右子树里的最小结点, 如50的后继节点是75, 75的后继节点是87
  • 当前节点无右子树:
    • 当前节点有父节点:
      • 当前节点是其父节点的左子节点: 当前节点的后继节点就是当前节点的父节点, 如12的后继节点是25, 25的后继节点是50
      • 当前节点是其父节点的右子节点: 从当前节点递归往上找父节点, 直到当前节点是其父节点的左子节点, 则后继节点就是该父节点了, 如87的后继节点是100, 87是其父节点75的右子节点(不是), 75是其父节点50的右子节点(不是), 50是其父节点100的左子节点, 所以87的后继节点是递归了两次之后的50的父节点100
    • 当前节点无父节点: 当前节点是根节点且无右子节点, 当前节点已是最大节点, 无后继节点, 如100没有后继节点

前驱节点

与后继节点相反

查找

从根节点起开始比较, 目标值小了就走左边, 大了就走右边, 直到找到或找不到

插入

边查找边判断, 如果找到了就不插入, 最终没找到就放到树中最后判断的结点的空子树位置上

删除

方式一: 操作节点

本质上就是找到要删除结点的前驱结点或者后继节点来代替该节点的位置, 替代后, 原节点变成没有子节点或只有一个子节点的情况了, 这样删除起来就变成了前两种情况了

  • 要删除的节点没有子节点(叶子结点): 直接删除
  • 要删除的节点只有一个子结点: 用子结点替代要删除的节点(记得重建父子关系)
  • 要删除的节点有两个子结点: 找到要删除节点的前驱结点或者后继节点来替代(记得重建父子关系)

方式二: 替换子树

其实还有一种更好的方式, 就是移动替换子树

  • 没有子树: 用node.left子树(null)覆盖node子树
  • 一个子树:
    • 是左子树: 用node.left子树覆盖node子树
    • 是右子树: 用node.right子树覆盖node子树
  • 两个子树: 找到后继节点successor
    • 如果successor不是node的直接子树, 则把node的右子树挂到successor下
      • 用successor的右子树替换掉successor, 相当于从树中把successor提取出来了, 其他的还拼接起来
      • 把successor提上来, 放到node的位置, 并和node的右子树连接起来. successor.right和node.right指向同一个子树
      • 该子树的parent从node指向successor
    • 用successor子树替换掉node子树, 相当于删除了node

时间复杂度

  • 查找: O(h), h是高度, 在平衡的情况下, h = logn + 1, 斜树时, h = n
  • 插入:
  • 删除

平衡二叉搜索树

什么是平衡二叉树(AVL)

简称平衡二叉树。由前苏联的数学家 Adelse-Velskil 和 Landis 在 1962 年提出的高度平衡的二叉树,根据科学家的英文名也称为 AVL 树

  • 可以是空树。
  • 假如不是空树,任何一个结点的左子树与右子树都是平衡二叉树,并且高度之差的绝对值不超过 1。

常见的平衡树:AVL树、红黑树、Treap、伸展树、加权平衡树、2-3树、AA树、替罪羊树、节点大小平衡树

红黑树

数据结构与算法之红黑树
红黑树——算法导论(15)
红黑树(一)之 原理和算法详细介绍
亲自动手绘图——红黑树,我不信还手撕不清楚
30张图带你彻底理解红黑树

你可能感兴趣的:(数据结构与算法)