查找问题
- 静态查找 不需要进行插入删除操作,使用二分查找即可
- 动态查找 需要执行插入删除操作,使用二分查找树
前提是都是有序的。
二叉搜索树
二叉搜索树(BST,Binary Search Tree), 也称二叉排序树或二叉查找树。
BST可以为空,非空BST如果不为空,满足以下性质:
- 非空左子树的所有键值小于其根结点的键值。
- 非空右子树的所有键值大于其根结点的键值。
- 左、右子树都是二叉搜索树。
BST操作的特殊函数:
1 | # 查找元素x |
函数实现
Find
1 | # Find递归实现 |
FindMax和FindMin
BST查找最大元素或者最小元素,只需记住:
- 最大元素一定是在树的最右分枝的端结点上
- 最小元素一定是在树的最左分枝的端结点上
如图所示:
代码实现:
1 | # 查找最大元素 |
Insert
主要是插入位置的选择,这里类似于Find,代码实现如下:
1 | # 插入操作递归 |
Delete
删除操作相对来说复杂一点,需要考虑三种情况:
- 如果是叶子节点的话直接删除,其父节点对应的指针置为空
- 只有一个子结点,将其父结点对应的指针指向其子结点
- 如果有两个子结点,寻找一个合适的结点去替代这个被删除的结点
- 使用右子树的最小值
- 使用左子树的最大值
为什么第三种情况要这么做?这么做的好处——左子树的最大值或者右子树的最小值一定不是有两个儿子的结点。左子树的最大值肯定位于左子树的最右边,右子树的最小值肯定位于右子树的最左边。
举个例子:
上面树的Delete代码实现如下:
1 | def BSTDelete(self, node, x): |