二分搜索树
定义
- 二分搜索树是一颗二叉树
- 二分搜索树种每个节点的值
- 大于左子树所有节点的值
- 小于右子树所有节点的值
- 每棵子树也是二分搜索树
存储的元素必须具备可比较性
1 | public class BST<E extends Comparable<E>> { |
添加元素
- 这里的二分搜索树是不添加相同元素的,如果想要添加可以对 14或16行 添加=条件
1 | public void add(E e) { |
查询操作
1 | public boolean contains(E e) { |
遍历操作
树的遍历操作中分为深度优先遍历
和广度优先遍历
深度优先遍历有:前序、中序、后序 这三种,每种都有各自的应用场景
- 前序遍历是最自然访问树的操作
- 中序遍历的节点是顺序的
- 后序遍历的一个应用是释放一棵树的内存(如C++语言中,需手动释放内存)
递归遍历
- 这里给出了前序遍历的递归写法,中序后序操作和其原理是一样的
1 | // 前序遍历 |
非递归遍历
- 非递归前序遍历相比之下要复杂许多,还需要借助额外的数据结构–>栈
- 非递归中序、后序遍历实现更加复杂,且应用不广
1 | public void preOrderNR(){ |
层序遍历
- 广度优先遍历就是层序遍历,可以通过队列作为辅助数据结构来实现
- 常用于算法设计中–最短路径(无全图)
1 | public void levelOrder(){ |
重写toString
为了方便在输出树的时候,可以更加清晰的看到树的结构,在这里对 toString 方法进行重写
1 |
|
删除元素
删除元素时,不能仅仅将元素删除,还要进行判断,如果被删除的元素有子树时,要将其安置好
查找最小元素
1 | // 寻找二分搜索树的最小元素 |
删除最小元素
如果是最小元素的那个节点有右子树,那么在删除该元素时,应该用其右子树替代该元素的位置
- 若该子树是小元素,新建节点,保存最小元素的右子树
- 将当前最小元素节点删除,并维护size
- 返回删除节点后新二分搜索树的根
1 | // 从二分搜索树中删除最小值所在节点, 返回最小值 |
删除任意元素
删除任意元素时有多种情况,每种情况都需要独立去看待(看下面代码中的注释更方便于理解)
1 | // 从二分搜索树中删除元素为e的节点 |