初步封装
1 | function BinarySearchTree() { |
二叉搜索树的常见操作
insert(key): 向树中插入一个新的键
search(key): 在树中查找一个键,如果节点存在,则返回true,否则返回false
inOrderTraverse: 通过中序遍历方式遍历所有节点(左子树、根、右子树)
preOrderTraverse: 通过先序遍历方式遍历所有节点(根、左子树、右子树)
postOrderTraverse: 通过后序遍历方式遍历所有节点(左子树、右子树、根)
min: 返回树中最小的值/键
max: 返回树中最大的值/键
remove(key):从树中移除某个键
二叉树的删除操作
删除节点从要查找的节点开始,找到节点后,需要考虑三种情况:
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() { |