二叉搜索树的常见操作
insert(key): 向树中插入一个新的键
search(key): 在树中查找一个键,如果节点存在,则返回true,否则返回false
inOrderTraverse: 通过中序遍历方式遍历所有节点
preOrderTraverse: 通过先序遍历方式遍历所有节点
postOrderTraverse: 通过后序遍历方式遍历所有节点
min: 返回树中最小的值/键
max: 返回树中最大的值/键
remove(key):从树中移除某个键
遍历
注意我们这里学习的树的遍历,针对所有的二叉树都是适用的,不仅仅是二叉搜索树
二叉树的遍历常见的三种方式:
1、先序遍历
2、中序遍历
3、后序遍历
(还有层序遍历,使用较少,可以使用队列来完成)
先序遍历:
1、遍历根节点
2、先序遍历左子树
3、先序遍历右子树
中序遍历:
1、中序遍历其左子树
2、访问根节点
3、中序遍历其右子树
后序遍历
1、后序遍历其左子树
2、后序遍历其右子树
3、访问根节点
二叉树的删除操作
删除节点要从查找要删的节点开始,找到节点后,需要考虑三种情况:
1、该节点是叶节点(没有子节点,比较简单)
2、该节点有一个子节点(也相对简单)
3、该节点有两个子节点(情况比较复杂,我们后面慢慢道来)
1、先找到要删除的节点,如果没有找到,不需要删除
2、找到要删除的节点
(1)、删除叶子节点
(2)、删除只有一个子节点的节点
(3)、删除有两个子节点的节点
情况一:没有子节点
- 我们需要检查current的left和right是否都为null
- 都为null之后还有检查一个东西,就是是否current就是根节点,如果是,相当于清空了根
- 否则直接把父节点的left或right设置为Null即可
情况二:有一个子节点
情况三:有两个子节点
如果我们要删除的节点有两个子节点,甚至子节点还有子节点,这种情况下我们需要从下面的子节点中找到一个节点,来替换当前的节点
但是找到的这个节点有什么特征呢?
应该是current节点下面所有节点中最接近current节点的
要么比current节点小一点点,要么比current节点大一点点
总结你最接近current,你可以用来替换current的位置
这个节点怎么找呢?
- 比current小一点点的节点,一定是current左子树的最大值
- 比current大一点点的节点,一定是current右子树的最小值
前驱和后继
在二叉搜索树中,这两个特别的节点,有两个特别的名字
- 比current小一点点的节点,称为current节点的前驱
- 比current大一点点的节点,称为current节点的后继
封装二叉搜索树类
1 | function BinarySearchTree() { |
测试
1 | // 测试 |