This commit is contained in:
krahets
2023-09-22 13:08:10 +08:00
parent 5bb9f76fbc
commit 6fffa33695
107 changed files with 2561 additions and 19178 deletions

View File

@@ -60,7 +60,18 @@
</head>
<link href="../../assets/stylesheets/glightbox.min.css" rel="stylesheet"/><style>
html.glightbox-open { overflow: initial; height: 100%; }
.gslide-title { margin-top: 0px; user-select: text; }
.gslide-desc { color: #666; user-select: text; }
.gslide-image img { background: white; }
.gscrollbar-fixer { padding-right: 15px; }
.gdesc-inner { font-size: 0.75rem; }
body[data-md-color-scheme="slate"] .gdesc-inner { background: var(--md-default-bg-color);}
body[data-md-color-scheme="slate"] .gslide-title { color: var(--md-default-fg-color);}
body[data-md-color-scheme="slate"] .gslide-desc { color: var(--md-default-fg-color);}
</style> <script src="../../assets/javascripts/glightbox.min.js"></script></head>
@@ -1999,14 +2010,6 @@
10.2 &nbsp; 二分查找插入点
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2027,14 +2030,6 @@
10.3 &nbsp; 二分查找边界
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2454,14 +2449,6 @@
第 12 章 &nbsp; 分治
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
@@ -2493,14 +2480,6 @@
12.1 &nbsp; 分治算法
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2521,14 +2500,6 @@
12.2 &nbsp; 分治搜索策略
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2549,14 +2520,6 @@
12.3 &nbsp; 构建树问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2577,14 +2540,6 @@
12.4 &nbsp; 汉诺塔问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2605,14 +2560,6 @@
12.5 &nbsp; 小结
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2844,14 +2791,6 @@
第 14 章 &nbsp; 动态规划
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
@@ -2883,14 +2822,6 @@
14.1 &nbsp; 初探动态规划
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2911,14 +2842,6 @@
14.2 &nbsp; DP 问题特性
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2939,14 +2862,6 @@
14.3 &nbsp; DP 解题思路
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2967,14 +2882,6 @@
14.4 &nbsp; 0-1 背包问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -2995,14 +2902,6 @@
14.5 &nbsp; 完全背包问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -3023,14 +2922,6 @@
14.6 &nbsp; 编辑距离问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -3051,14 +2942,6 @@
14.7 &nbsp; 小结
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -3117,14 +3000,6 @@
第 15 章 &nbsp; 贪心
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
@@ -3156,14 +3031,6 @@
15.1 &nbsp; 贪心算法
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -3184,14 +3051,6 @@
15.2 &nbsp; 分数背包问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -3212,14 +3071,6 @@
15.3 &nbsp; 最大容量问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -3240,14 +3091,6 @@
15.4 &nbsp; 最大切分乘积问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -3268,14 +3111,6 @@
15.5 &nbsp; 小结
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@@ -3752,7 +3587,7 @@
</div>
<p>每个节点都有两个引用(指针),分别指向「左子节点 left-child node」和「右子节点 right-child node」该节点被称为这两个子节点的「父节点 parent node」。当给定一个二叉树的节点时我们将该节点的左子节点及其以下节点形成的树称为该节点的「左子树 left subtree」同理可得「右子树 right subtree」。</p>
<p><strong>在二叉树中,除叶节点外,其他所有节点都包含子节点和非空子树</strong>。如图 7-1 所示,如果将“节点 2”视为父节点则其左子节点和右子节点分别是“节点 4”和“节点 5”左子树是“节点 4 及其以下节点形成的树”,右子树是“节点 5 及其以下节点形成的树”。</p>
<p><img alt="父节点、子节点、子树" src="../binary_tree.assets/binary_tree_definition.png" /></p>
<p><a class="glightbox" href="../binary_tree.assets/binary_tree_definition.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="父节点、子节点、子树" src="../binary_tree.assets/binary_tree_definition.png" /></a></p>
<p align="center"> 图 7-1 &nbsp; 父节点、子节点、子树 </p>
<h2 id="711">7.1.1 &nbsp; 二叉树常见术语<a class="headerlink" href="#711" title="Permanent link">&para;</a></h2>
@@ -3767,7 +3602,7 @@
<li>节点的「深度 depth」从根节点到该节点所经过的边的数量。</li>
<li>节点的「高度 height」从最远叶节点到该节点所经过的边的数量。</li>
</ul>
<p><img alt="二叉树的常用术语" src="../binary_tree.assets/binary_tree_terminology.png" /></p>
<p><a class="glightbox" href="../binary_tree.assets/binary_tree_terminology.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="二叉树的常用术语" src="../binary_tree.assets/binary_tree_terminology.png" /></a></p>
<p align="center"> 图 7-2 &nbsp; 二叉树的常用术语 </p>
<div class="admonition tip">
@@ -3939,7 +3774,7 @@
</div>
<h3 id="2">2. &nbsp; 插入与删除节点<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3>
<p>与链表类似,在二叉树中插入与删除节点可以通过修改指针来实现。图 7-3 给出了一个示例。</p>
<p><img alt="在二叉树中插入与删除节点" src="../binary_tree.assets/binary_tree_add_remove.png" /></p>
<p><a class="glightbox" href="../binary_tree.assets/binary_tree_add_remove.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="在二叉树中插入与删除节点" src="../binary_tree.assets/binary_tree_add_remove.png" /></a></p>
<p align="center"> 图 7-3 &nbsp; 在二叉树中插入与删除节点 </p>
<div class="tabbed-set tabbed-alternate" data-tabs="3:12"><input checked="checked" id="__tabbed_3_1" name="__tabbed_3" type="radio" /><input id="__tabbed_3_2" name="__tabbed_3" type="radio" /><input id="__tabbed_3_3" name="__tabbed_3" type="radio" /><input id="__tabbed_3_4" name="__tabbed_3" type="radio" /><input id="__tabbed_3_5" name="__tabbed_3" type="radio" /><input id="__tabbed_3_6" name="__tabbed_3" type="radio" /><input id="__tabbed_3_7" name="__tabbed_3" type="radio" /><input id="__tabbed_3_8" name="__tabbed_3" type="radio" /><input id="__tabbed_3_9" name="__tabbed_3" type="radio" /><input id="__tabbed_3_10" name="__tabbed_3" type="radio" /><input id="__tabbed_3_11" name="__tabbed_3" type="radio" /><input id="__tabbed_3_12" name="__tabbed_3" type="radio" /><div class="tabbed-labels"><label for="__tabbed_3_1">Python</label><label for="__tabbed_3_2">C++</label><label for="__tabbed_3_3">Java</label><label for="__tabbed_3_4">C#</label><label for="__tabbed_3_5">Go</label><label for="__tabbed_3_6">Swift</label><label for="__tabbed_3_7">JS</label><label for="__tabbed_3_8">TS</label><label for="__tabbed_3_9">Dart</label><label for="__tabbed_3_10">Rust</label><label for="__tabbed_3_11">C</label><label for="__tabbed_3_12">Zig</label></div>
@@ -4063,22 +3898,22 @@
<p class="admonition-title">Tip</p>
<p>请注意,在中文社区中,完美二叉树常被称为「满二叉树」。</p>
</div>
<p><img alt="完美二叉树" src="../binary_tree.assets/perfect_binary_tree.png" /></p>
<p><a class="glightbox" href="../binary_tree.assets/perfect_binary_tree.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="完美二叉树" src="../binary_tree.assets/perfect_binary_tree.png" /></a></p>
<p align="center"> 图 7-4 &nbsp; 完美二叉树 </p>
<h3 id="2_1">2. &nbsp; 完全二叉树<a class="headerlink" href="#2_1" title="Permanent link">&para;</a></h3>
<p>如图 7-5 所示,「完全二叉树 complete binary tree」只有最底层的节点未被填满且最底层节点尽量靠左填充。</p>
<p><img alt="完全二叉树" src="../binary_tree.assets/complete_binary_tree.png" /></p>
<p><a class="glightbox" href="../binary_tree.assets/complete_binary_tree.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="完全二叉树" src="../binary_tree.assets/complete_binary_tree.png" /></a></p>
<p align="center"> 图 7-5 &nbsp; 完全二叉树 </p>
<h3 id="3">3. &nbsp; 完满二叉树<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3>
<p>如图 7-6 所示,「完满二叉树 full binary tree」除了叶节点之外其余所有节点都有两个子节点。</p>
<p><img alt="完满二叉树" src="../binary_tree.assets/full_binary_tree.png" /></p>
<p><a class="glightbox" href="../binary_tree.assets/full_binary_tree.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="完满二叉树" src="../binary_tree.assets/full_binary_tree.png" /></a></p>
<p align="center"> 图 7-6 &nbsp; 完满二叉树 </p>
<h3 id="4">4. &nbsp; 平衡二叉树<a class="headerlink" href="#4" title="Permanent link">&para;</a></h3>
<p>如图 7-7 所示,「平衡二叉树 balanced binary tree」中任意节点的左子树和右子树的高度之差的绝对值不超过 1 。</p>
<p><img alt="平衡二叉树" src="../binary_tree.assets/balanced_binary_tree.png" /></p>
<p><a class="glightbox" href="../binary_tree.assets/balanced_binary_tree.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="平衡二叉树" src="../binary_tree.assets/balanced_binary_tree.png" /></a></p>
<p align="center"> 图 7-7 &nbsp; 平衡二叉树 </p>
<h2 id="714">7.1.4 &nbsp; 二叉树的退化<a class="headerlink" href="#714" title="Permanent link">&para;</a></h2>
@@ -4087,7 +3922,7 @@
<li>完美二叉树是理想情况,可以充分发挥二叉树“分治”的优势。</li>
<li>链表则是另一个极端,各项操作都变为线性操作,时间复杂度退化至 <span class="arithmatex">\(O(n)\)</span></li>
</ul>
<p><img alt="二叉树的最佳与最差结构" src="../binary_tree.assets/binary_tree_best_worst_cases.png" /></p>
<p><a class="glightbox" href="../binary_tree.assets/binary_tree_best_worst_cases.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="二叉树的最佳与最差结构" src="../binary_tree.assets/binary_tree_best_worst_cases.png" /></a></p>
<p align="center"> 图 7-8 &nbsp; 二叉树的最佳与最差结构 </p>
<p>如表 7-1 所示,在最佳和最差结构下,二叉树的叶节点数量、节点总数、高度等达到极大或极小值。</p>
@@ -4289,10 +4124,15 @@ aria-label="页脚"
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2023 Krahets
Copyright &copy; 2022 - 2023 Krahets
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<!-- Social links -->
@@ -4361,5 +4201,5 @@ aria-label="页脚"
</body>
<script>document$.subscribe(() => {const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": false, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "none"});})</script></body>
</html>