This commit is contained in:
krahets
2023-05-21 19:29:51 +08:00
parent 2adbd1b856
commit 61055d21bd
83 changed files with 11043 additions and 13422 deletions
+198 -237
View File
@@ -25,7 +25,7 @@
<title>8.4.   二叉搜索树 - Hello 算法</title>
<title>7.4.   二叉搜索树 - Hello 算法</title>
@@ -79,7 +79,7 @@
<div data-md-component="skip">
<a href="#84" class="md-skip">
<a href="#74" class="md-skip">
跳转至
</a>
@@ -113,7 +113,7 @@
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
8.4. &nbsp; 二叉搜索树
7.4. &nbsp; 二叉搜索树
</span>
</div>
@@ -865,90 +865,19 @@
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
6. &nbsp; &nbsp; 二分查找
6. &nbsp; &nbsp; 散列表
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
6. &nbsp; &nbsp; 二分查找
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter_binary_search/binary_search/" class="md-nav__link">
6.1. &nbsp; 二分查找
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_binary_search/binary_search_edge/" class="md-nav__link">
6.2. &nbsp; 二分查找边界
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" >
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
7. &nbsp; &nbsp; 散列表
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
7. &nbsp; &nbsp; 散列表
6. &nbsp; &nbsp; 散列表
</label>
<ul class="md-nav__list" data-md-scrollfix>
@@ -959,7 +888,7 @@
<li class="md-nav__item">
<a href="../../chapter_hashing/hash_map/" class="md-nav__link">
7.1. &nbsp; 哈希表
6.1. &nbsp; 哈希表
</a>
</li>
@@ -973,7 +902,7 @@
<li class="md-nav__item">
<a href="../../chapter_hashing/hash_collision/" class="md-nav__link">
7.2. &nbsp; 哈希冲突处理
6.2. &nbsp; 哈希冲突处理
</a>
</li>
@@ -987,7 +916,7 @@
<li class="md-nav__item">
<a href="../../chapter_hashing/summary/" class="md-nav__link">
7.3. &nbsp; 小结
6.3. &nbsp; 小结
</a>
</li>
@@ -1017,7 +946,7 @@
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_9" checked>
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" checked>
@@ -1035,15 +964,15 @@
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
8. &nbsp; &nbsp;
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
7. &nbsp; &nbsp;
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_9">
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
8. &nbsp; &nbsp;
7. &nbsp; &nbsp;
</label>
<ul class="md-nav__list" data-md-scrollfix>
@@ -1054,7 +983,7 @@
<li class="md-nav__item">
<a href="../binary_tree/" class="md-nav__link">
8.1. &nbsp; 二叉树
7.1. &nbsp; 二叉树
</a>
</li>
@@ -1068,7 +997,7 @@
<li class="md-nav__item">
<a href="../binary_tree_traversal/" class="md-nav__link">
8.2. &nbsp; 二叉树遍历
7.2. &nbsp; 二叉树遍历
</a>
</li>
@@ -1082,7 +1011,7 @@
<li class="md-nav__item">
<a href="../array_representation_of_tree/" class="md-nav__link">
8.3. &nbsp; 二叉树数组表示
7.3. &nbsp; 二叉树数组表示
</a>
</li>
@@ -1105,12 +1034,12 @@
<label class="md-nav__link md-nav__link--active" for="__toc">
8.4. &nbsp; 二叉搜索树
7.4. &nbsp; 二叉搜索树
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
8.4. &nbsp; 二叉搜索树
7.4. &nbsp; 二叉搜索树
</a>
@@ -1129,11 +1058,11 @@
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#841" class="md-nav__link">
8.4.1. &nbsp; 二叉搜索树的操作
<a href="#741" class="md-nav__link">
7.4.1. &nbsp; 二叉搜索树的操作
</a>
<nav class="md-nav" aria-label="8.4.1. &nbsp; 二叉搜索树的操作">
<nav class="md-nav" aria-label="7.4.1. &nbsp; 二叉搜索树的操作">
<ul class="md-nav__list">
<li class="md-nav__item">
@@ -1170,15 +1099,15 @@
</li>
<li class="md-nav__item">
<a href="#842" class="md-nav__link">
8.4.2. &nbsp; 二叉搜索树的效率
<a href="#742" class="md-nav__link">
7.4.2. &nbsp; 二叉搜索树的效率
</a>
</li>
<li class="md-nav__item">
<a href="#843" class="md-nav__link">
8.4.3. &nbsp; 二叉搜索树常见应用
<a href="#743" class="md-nav__link">
7.4.3. &nbsp; 二叉搜索树常见应用
</a>
</li>
@@ -1199,7 +1128,7 @@
<li class="md-nav__item">
<a href="../avl_tree/" class="md-nav__link">
8.5. &nbsp; AVL 树 *
7.5. &nbsp; AVL 树 *
</a>
</li>
@@ -1213,7 +1142,94 @@
<li class="md-nav__item">
<a href="../summary/" class="md-nav__link">
8.6. &nbsp; 小结
7.6. &nbsp; 小结
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_9" >
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
8. &nbsp; &nbsp;
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
8. &nbsp; &nbsp;
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter_heap/heap/" class="md-nav__link">
8.1. &nbsp;
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_heap/build_heap/" class="md-nav__link">
8.2. &nbsp; 建堆操作 *
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_heap/summary/" class="md-nav__link">
8.3. &nbsp; 小结
</a>
</li>
@@ -1251,17 +1267,19 @@
<label class="md-nav__link" for="__nav_10" id="__nav_10_label" tabindex="0">
9. &nbsp; &nbsp;
9. &nbsp; &nbsp;
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_10_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_10">
<span class="md-nav__icon md-icon"></span>
9. &nbsp; &nbsp;
9. &nbsp; &nbsp;
</label>
<ul class="md-nav__list" data-md-scrollfix>
@@ -1271,8 +1289,8 @@
<li class="md-nav__item">
<a href="../../chapter_heap/heap/" class="md-nav__link">
9.1. &nbsp;
<a href="../../chapter_graph/graph/" class="md-nav__link">
9.1. &nbsp;
</a>
</li>
@@ -1285,8 +1303,8 @@
<li class="md-nav__item">
<a href="../../chapter_heap/build_heap/" class="md-nav__link">
9.2. &nbsp; 建堆操作 *
<a href="../../chapter_graph/graph_operations/" class="md-nav__link">
9.2. &nbsp; 图基础操作
</a>
</li>
@@ -1299,8 +1317,22 @@
<li class="md-nav__item">
<a href="../../chapter_heap/summary/" class="md-nav__link">
9.3. &nbsp; 小结
<a href="../../chapter_graph/graph_traversal/" class="md-nav__link">
9.3. &nbsp; 图的遍历
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_graph/summary/" class="md-nav__link">
9.4. &nbsp; 小结
</a>
</li>
@@ -1340,17 +1372,19 @@
<label class="md-nav__link" for="__nav_11" id="__nav_11_label" tabindex="0">
10. &nbsp; &nbsp;
10. &nbsp; &nbsp; 搜索算法
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_11_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_11">
<span class="md-nav__icon md-icon"></span>
10. &nbsp; &nbsp;
10. &nbsp; &nbsp; 搜索算法
</label>
<ul class="md-nav__list" data-md-scrollfix>
@@ -1360,8 +1394,8 @@
<li class="md-nav__item">
<a href="../../chapter_graph/graph/" class="md-nav__link">
10.1. &nbsp;
<a href="../../chapter_searching/binary_search/" class="md-nav__link">
10.1. &nbsp; 二分查找(New
</a>
</li>
@@ -1374,8 +1408,8 @@
<li class="md-nav__item">
<a href="../../chapter_graph/graph_operations/" class="md-nav__link">
10.2. &nbsp; 图基础操作
<a href="../../chapter_searching/binary_search_edge/" class="md-nav__link">
10.2. &nbsp; 二分查找边界(New
</a>
</li>
@@ -1388,8 +1422,8 @@
<li class="md-nav__item">
<a href="../../chapter_graph/graph_traversal/" class="md-nav__link">
10.3. &nbsp; 图的遍历
<a href="../../chapter_searching/replace_linear_by_hashing/" class="md-nav__link">
10.3. &nbsp; 哈希优化策略
</a>
</li>
@@ -1402,8 +1436,22 @@
<li class="md-nav__item">
<a href="../../chapter_graph/summary/" class="md-nav__link">
10.4. &nbsp; 小结
<a href="../../chapter_searching/searching_algorithm_revisited/" class="md-nav__link">
10.4. &nbsp; 重识搜索算法
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_searching/summary/" class="md-nav__link">
10.5. &nbsp; 小结
</a>
</li>
@@ -1627,14 +1675,14 @@
<label class="md-nav__link" for="__nav_13" id="__nav_13_label" tabindex="0">
12. &nbsp; &nbsp; 搜索算法
12. &nbsp; &nbsp; 回溯算法
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_13">
<span class="md-nav__icon md-icon"></span>
12. &nbsp; &nbsp; 搜索算法
12. &nbsp; &nbsp; 回溯算法
</label>
<ul class="md-nav__list" data-md-scrollfix>
@@ -1644,8 +1692,8 @@
<li class="md-nav__item">
<a href="../../chapter_searching/searching_algorithm_revisited/" class="md-nav__link">
12.1. &nbsp; 搜索算法(New
<a href="../../chapter_backtracking/backtracking_algorithm/" class="md-nav__link">
12.1. &nbsp; 回溯算法(New
</a>
</li>
@@ -1658,8 +1706,8 @@
<li class="md-nav__item">
<a href="../../chapter_searching/replace_linear_by_hashing/" class="md-nav__link">
12.2. &nbsp; 哈希优化策略
<a href="../../chapter_backtracking/permutations_problem/" class="md-nav__link">
12.2. &nbsp; 全排列问题(New
</a>
</li>
@@ -1672,8 +1720,8 @@
<li class="md-nav__item">
<a href="../../chapter_searching/summary/" class="md-nav__link">
12.3. &nbsp; 小结
<a href="../../chapter_backtracking/n_queens_problem/" class="md-nav__link">
12.3. &nbsp; N 皇后问题(New
</a>
</li>
@@ -1709,19 +1757,17 @@
<label class="md-nav__link" for="__nav_14" id="__nav_14_label" tabindex="0">
13. &nbsp; &nbsp; 回溯算法
13. &nbsp; &nbsp; 附录
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_14_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_14">
<span class="md-nav__icon md-icon"></span>
13. &nbsp; &nbsp; 回溯算法
13. &nbsp; &nbsp; 附录
</label>
<ul class="md-nav__list" data-md-scrollfix>
@@ -1731,8 +1777,8 @@
<li class="md-nav__item">
<a href="../../chapter_backtracking/backtracking_algorithm/" class="md-nav__link">
13.1. &nbsp; 回溯算法(New
<a href="../../chapter_appendix/installation/" class="md-nav__link">
13.1. &nbsp; 编程环境安装
</a>
</li>
@@ -1745,22 +1791,8 @@
<li class="md-nav__item">
<a href="../../chapter_backtracking/permutations_problem/" class="md-nav__link">
13.2. &nbsp; 全排列问题(New
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_backtracking/n_queens_problem/" class="md-nav__link">
13.3. &nbsp; N 皇后问题(New
<a href="../../chapter_appendix/contribution/" class="md-nav__link">
13.2. &nbsp; 一起参与创作
</a>
</li>
@@ -1793,77 +1825,6 @@
<label class="md-nav__link" for="__nav_15" id="__nav_15_label" tabindex="0">
14. &nbsp; &nbsp; 附录
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_15_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_15">
<span class="md-nav__icon md-icon"></span>
14. &nbsp; &nbsp; 附录
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter_appendix/installation/" class="md-nav__link">
14.1. &nbsp; 编程环境安装
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_appendix/contribution/" class="md-nav__link">
14.2. &nbsp; 一起参与创作
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_16" >
@@ -1876,8 +1837,8 @@
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_16_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_16">
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_15_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_15">
<span class="md-nav__icon md-icon"></span>
参考文献
</label>
@@ -1918,11 +1879,11 @@
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#841" class="md-nav__link">
8.4.1. &nbsp; 二叉搜索树的操作
<a href="#741" class="md-nav__link">
7.4.1. &nbsp; 二叉搜索树的操作
</a>
<nav class="md-nav" aria-label="8.4.1. &nbsp; 二叉搜索树的操作">
<nav class="md-nav" aria-label="7.4.1. &nbsp; 二叉搜索树的操作">
<ul class="md-nav__list">
<li class="md-nav__item">
@@ -1959,15 +1920,15 @@
</li>
<li class="md-nav__item">
<a href="#842" class="md-nav__link">
8.4.2. &nbsp; 二叉搜索树的效率
<a href="#742" class="md-nav__link">
7.4.2. &nbsp; 二叉搜索树的效率
</a>
</li>
<li class="md-nav__item">
<a href="#843" class="md-nav__link">
8.4.3. &nbsp; 二叉搜索树常见应用
<a href="#743" class="md-nav__link">
7.4.3. &nbsp; 二叉搜索树常见应用
</a>
</li>
@@ -1995,7 +1956,7 @@
<h1 id="84">8.4. &nbsp; 二叉搜索树<a class="headerlink" href="#84" title="Permanent link">&para;</a></h1>
<h1 id="74">7.4. &nbsp; 二叉搜索树<a class="headerlink" href="#74" title="Permanent link">&para;</a></h1>
<p>「二叉搜索树 Binary Search Tree」满足以下条件:</p>
<ol>
<li>对于根节点,左子树中所有节点的值 <span class="arithmatex">\(&lt;\)</span> 根节点的值 <span class="arithmatex">\(&lt;\)</span> 右子树中所有节点的值;</li>
@@ -2004,7 +1965,7 @@
<p><img alt="二叉搜索树" src="../binary_search_tree.assets/binary_search_tree.png" /></p>
<p align="center"> Fig. 二叉搜索树 </p>
<h2 id="841">8.4.1. &nbsp; 二叉搜索树的操作<a class="headerlink" href="#841" title="Permanent link">&para;</a></h2>
<h2 id="741">7.4.1. &nbsp; 二叉搜索树的操作<a class="headerlink" href="#741" title="Permanent link">&para;</a></h2>
<h3 id="_1">查找节点<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3>
<p>给定目标节点值 <code>num</code> ,可以根据二叉搜索树的性质来查找。我们声明一个节点 <code>cur</code> ,从二叉树的根节点 <code>root</code> 出发,循环比较节点值 <code>cur.val</code><code>num</code> 之间的大小关系</p>
<ul>
@@ -3091,7 +3052,7 @@
<p><img alt="二叉搜索树的中序遍历序列" src="../binary_search_tree.assets/bst_inorder_traversal.png" /></p>
<p align="center"> Fig. 二叉搜索树的中序遍历序列 </p>
<h2 id="842">8.4.2. &nbsp; 二叉搜索树的效率<a class="headerlink" href="#842" title="Permanent link">&para;</a></h2>
<h2 id="742">7.4.2. &nbsp; 二叉搜索树的效率<a class="headerlink" href="#742" title="Permanent link">&para;</a></h2>
<p>给定一组数据,我们考虑使用数组或二叉搜索树存储。</p>
<p>观察可知,二叉搜索树的各项操作的时间复杂度都是对数阶,具有稳定且高效的性能表现。只有在高频添加、低频查找删除的数据适用场景下,数组比二叉搜索树的效率更高。</p>
<div class="center-table">
@@ -3127,7 +3088,7 @@
<p><img alt="二叉搜索树的平衡与退化" src="../binary_search_tree.assets/bst_degradation.png" /></p>
<p align="center"> Fig. 二叉搜索树的平衡与退化 </p>
<h2 id="843">8.4.3. &nbsp; 二叉搜索树常见应用<a class="headerlink" href="#843" title="Permanent link">&para;</a></h2>
<h2 id="743">7.4.3. &nbsp; 二叉搜索树常见应用<a class="headerlink" href="#743" title="Permanent link">&para;</a></h2>
<ul>
<li>用作系统中的多级索引,实现高效的查找、插入、删除操作。</li>
<li>作为某些搜索算法的底层数据结构。</li>
@@ -3210,7 +3171,7 @@
<nav class="md-footer__inner md-grid" aria-label="页脚" >
<a href="../array_representation_of_tree/" class="md-footer__link md-footer__link--prev" aria-label="上一页: 8.3. &amp;nbsp; 二叉树数组表示" rel="prev">
<a href="../array_representation_of_tree/" class="md-footer__link md-footer__link--prev" aria-label="上一页: 7.3. &amp;nbsp; 二叉树数组表示" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</div>
@@ -3219,20 +3180,20 @@
上一页
</span>
<div class="md-ellipsis">
8.3. &nbsp; 二叉树数组表示
7.3. &nbsp; 二叉树数组表示
</div>
</div>
</a>
<a href="../avl_tree/" class="md-footer__link md-footer__link--next" aria-label="下一页: 8.5. &amp;nbsp; AVL 树 *" rel="next">
<a href="../avl_tree/" class="md-footer__link md-footer__link--next" aria-label="下一页: 7.5. &amp;nbsp; AVL 树 *" rel="next">
<div class="md-footer__title">
<span class="md-footer__direction">
下一页
</span>
<div class="md-ellipsis">
8.5. &nbsp; AVL 树 *
7.5. &nbsp; AVL 树 *
</div>
</div>
<div class="md-footer__button md-icon">