This commit is contained in:
krahets
2023-12-02 06:24:05 +08:00
parent a4a23e2488
commit a7f5434009
93 changed files with 1463 additions and 1484 deletions

View File

@@ -39,7 +39,7 @@ comments: true
<p align="center"> 图 7-17 &nbsp; 二叉搜索树查找节点示例 </p>
二叉搜索树的查找操作与二分查找算法的工作原理一致,都是每轮排除一半情况。循环次数最多为二叉树的高度,当二叉树平衡时,使用 $O(\log n)$ 时间。
二叉搜索树的查找操作与二分查找算法的工作原理一致,都是每轮排除一半情况。循环次数最多为二叉树的高度,当二叉树平衡时,使用 $O(\log n)$ 时间。示例代码如下:
=== "Python"
@@ -745,11 +745,11 @@ comments: true
### 3. &nbsp; 删除节点
先在二叉树中查找到目标节点,再将其从二叉树中删除。
先在二叉树中查找到目标节点,再将其删除。
与插入节点类似,我们需要保证在删除操作完成后,二叉搜索树的“左子树 < 根节点 < 右子树”的性质仍然满足。
因此,我们需要根据目标节点的子节点数量,共分为 0、1 和 2 三种情况,执行对应的删除节点操作。
因此,我们根据目标节点的子节点数量, 0、1 和 2 三种情况,执行对应的删除节点操作。
如图 7-19 所示,当待删除节点的度为 $0$ 时,表示该节点是叶节点,可以直接删除。
@@ -763,12 +763,12 @@ comments: true
<p align="center"> 图 7-20 &nbsp; 在二叉搜索树中删除节点(度为 1 </p>
当待删除节点的度为 $2$ 时,我们无法直接删除它,而需要使用一个节点替换该节点。由于要保持二叉搜索树“左 $<$ 根 $<$ 右”的性质,**因此这个节点可以是右子树的最小节点或左子树的最大节点**。
当待删除节点的度为 $2$ 时,我们无法直接删除它,而需要使用一个节点替换该节点。由于要保持二叉搜索树“左子树 $<$ 根节点 $<$ 右子树”的性质,**因此这个节点可以是右子树的最小节点或左子树的最大节点**。
假设我们选择右子树的最小节点(中序遍历的下一个节点),则删除操作流程如图 7-21 所示。
假设我们选择右子树的最小节点(中序遍历的下一个节点),则删除操作流程如图 7-21 所示。
1. 找到待删除节点在“中序遍历序列”中的下一个节点,记为 `tmp` 。
2. `tmp` 的值覆盖待删除节点的值,并在树中递归删除节点 `tmp` 。
2. `tmp` 的值覆盖待删除节点的值,并在树中递归删除节点 `tmp` 。
=== "<1>"
![在二叉搜索树中删除节点(度为 2 ](binary_search_tree.assets/bst_remove_case3_step1.png){ class="animation-figure" }
@@ -784,7 +784,7 @@ comments: true
<p align="center"> 图 7-21 &nbsp; 在二叉搜索树中删除节点(度为 2 </p>
删除节点操作同样使用 $O(\log n)$ 时间,其中查找待删除节点需要 $O(\log n)$ 时间,获取中序遍历后继节点需要 $O(\log n)$ 时间。
删除节点操作同样使用 $O(\log n)$ 时间,其中查找待删除节点需要 $O(\log n)$ 时间,获取中序遍历后继节点需要 $O(\log n)$ 时间。示例代码如下:
=== "Python"
@@ -1470,7 +1470,7 @@ comments: true
## 7.4.2 &nbsp; 二叉搜索树的效率
给定一组数据,我们考虑使用数组或二叉搜索树存储。观察表 7-2 ,二叉搜索树的各项操作的时间复杂度都是对数阶,具有稳定且高效的性能表现。只有在高频添加、低频查找删除数据适用场景下,数组比二叉搜索树的效率更高。
给定一组数据,我们考虑使用数组或二叉搜索树存储。观察表 7-2 ,二叉搜索树的各项操作的时间复杂度都是对数阶,具有稳定且高效的性能。只有在高频添加、低频查找删除数据场景下,数组比二叉搜索树的效率更高。
<p align="center"> 表 7-2 &nbsp; 数组与搜索树的效率对比 </p>
@@ -1488,9 +1488,9 @@ comments: true
然而,如果我们在二叉搜索树中不断地插入和删除节点,可能导致二叉树退化为图 7-23 所示的链表,这时各种操作的时间复杂度也会退化为 $O(n)$ 。
![二叉搜索树退化](binary_search_tree.assets/bst_degradation.png){ class="animation-figure" }
![二叉搜索树退化](binary_search_tree.assets/bst_degradation.png){ class="animation-figure" }
<p align="center"> 图 7-23 &nbsp; 二叉搜索树退化 </p>
<p align="center"> 图 7-23 &nbsp; 二叉搜索树退化 </p>
## 7.4.3 &nbsp; 二叉搜索树常见应用