原理
二叉查找树(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
的最小结点
假设求P后继的方法:
查找P是否存在:
存在
- 顺着P结点的右子树一路向左走到底,最后一个点就是它的后继
- 没有右子树,则后继一定存在从根开始走过的点中,最小的那个点就是
- P不存在时按照没有右子树的方法查找
其中 val
为要找结点的值
如上图所示:
9的前驱就是5,后继为10
10的前驱为9,后继为12
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。