原理

二叉查找树(Binary Search Tree),(又:二叉搜寻树,二叉排序树)它或者是一棵空树,或者是具备下列性质的二叉树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也别离为二叉排序树。

二叉搜寻树作为一种经典的数据结构,它既有链表的疾速插入与删除操作的特点,又有数组疾速查找的劣势;所以利用非常宽泛,例如在文件系统和数据库系统个别会采纳这种数据结构进行高效率的排序与检索操作。

二叉搜寻树操作

不管哪一种操作,所花的工夫都和树的高度成正比。因而,如果共有n个元素,那么均匀每次操作须要O(logn)的工夫。

  • 查找

    • 查找 val 是否存在,从根递归的开始查找

      • 若以后节点的 value 等于要查找的 val ,则已找到
      • 若 val < 小于节点的 value ,则递归的查找左子树,找不到则不存在
      • 若 val > 小于节点的 value ,则递归的查找右子树,找不到则不存在
  • 插入,和查找的过程相似

    • 先检索是否存在

      • 存在:

        • 放弃插入将雷同元素放入右子树(右边的节点值必须小于父节点值)
        • 应用计数器计数,存在时计数器+1
      • 不存在:

        • 间接在对应的地位新建节点即可
  • 删除

    • 叶子节点:间接删除,不影响原树
    • 仅仅有左或右子树的节点:节点删除后,将它的左子树或右子树整个挪动到删除节点的地位就能够,子承父业。
    • 既有左又有右子树的节点:找到须要删除的节点p的间接前驱或者间接后继s,用s来替换节点p,而后再删除节点s。

上述操作理论演示能够在以下网站操作演示:
https://www.cs.usfca.edu/~galles/visualization/BST.html
https://www.comp.nus.edu.sg/~stevenha/

前驱:BST中小于 val 的最大节点

后继:BST中大于 val 的最小节点

其中 val 为要找节点的值

如上图所示:
9的前驱就是5,后继为10
10的前驱为9,后继为12