mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-31 20:37:14 +00:00
Format code and docs.
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
!!! question
|
||||
|
||||
给定一个二叉树的前序遍历 `preorder` 和中序遍历 `inorder` ,请从中构建二叉树,返回二叉树的根节点。
|
||||
给定一个二叉树的前序遍历 `preorder` 和中序遍历 `inorder` ,请从中构建二叉树,返回二叉树的根节点。假设二叉树中没有值重复的节点。
|
||||
|
||||

|
||||
|
||||
@@ -44,10 +44,10 @@
|
||||
<p align="center"> 表 <id> 根节点和子树在前序和中序遍历中的索引 </p>
|
||||
|
||||
| | 根节点在 `preorder` 中的索引 | 子树在 `inorder` 中的索引区间 |
|
||||
| ------ | -------------------------------- | ----------------------------- |
|
||||
| 当前树 | $i$ | $[l, r]$ |
|
||||
| 左子树 | $i + 1$ | $[l, m-1]$ |
|
||||
| 右子树 | $i + 1 + (m - l)$ | $[m+1, r]$ |
|
||||
| ------ | ---------------------------- | ----------------------------- |
|
||||
| 当前树 | $i$ | $[l, r]$ |
|
||||
| 左子树 | $i + 1$ | $[l, m-1]$ |
|
||||
| 右子树 | $i + 1 + (m - l)$ | $[m+1, r]$ |
|
||||
|
||||
请注意,右子树根节点索引中的 $(m-l)$ 的含义是“左子树的节点数量”,建议配合下图理解。
|
||||
|
||||
|
||||
@@ -76,8 +76,8 @@ $$
|
||||
|
||||
<p align="center"> 表 <id> 现实生活中常见的图 </p>
|
||||
|
||||
| | 顶点 | 边 | 图计算问题 |
|
||||
| ------ | ---- | --------------- | ------------ |
|
||||
| 社交网络 | 用户 | 好友关系 | 潜在好友推荐 |
|
||||
| 地铁线路 | 站点 | 站点间的连通性 | 最短路线推荐 |
|
||||
| 太阳系 | 星体 | 星体间的万有引力作用 | 行星轨道计算 |
|
||||
| | 顶点 | 边 | 图计算问题 |
|
||||
| -------- | ---- | -------------------- | ------------ |
|
||||
| 社交网络 | 用户 | 好友关系 | 潜在好友推荐 |
|
||||
| 地铁线路 | 站点 | 站点间的连通性 | 最短路线推荐 |
|
||||
| 太阳系 | 星体 | 星体间的万有引力作用 | 行星轨道计算 |
|
||||
|
||||
@@ -23,13 +23,13 @@
|
||||
|
||||
<p align="center"> 表 <id> 堆的操作效率 </p>
|
||||
|
||||
| 方法名 | 描述 | 时间复杂度 |
|
||||
| --------- | ------------------------------------------ | ----------- |
|
||||
| push() | 元素入堆 | $O(\log n)$ |
|
||||
| pop() | 堆顶元素出堆 | $O(\log n)$ |
|
||||
| peek() | 访问堆顶元素(大 / 小顶堆分别为最大 / 小值) | $O(1)$ |
|
||||
| size() | 获取堆的元素数量 | $O(1)$ |
|
||||
| isEmpty() | 判断堆是否为空 | $O(1)$ |
|
||||
| 方法名 | 描述 | 时间复杂度 |
|
||||
| --------- | -------------------------------------------- | ----------- |
|
||||
| push() | 元素入堆 | $O(\log n)$ |
|
||||
| pop() | 堆顶元素出堆 | $O(\log n)$ |
|
||||
| peek() | 访问堆顶元素(大 / 小顶堆分别为最大 / 小值) | $O(1)$ |
|
||||
| size() | 获取堆的元素数量 | $O(1)$ |
|
||||
| isEmpty() | 判断堆是否为空 | $O(1)$ |
|
||||
|
||||
在实际应用中,我们可以直接使用编程语言提供的堆类(或优先队列类)。
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
<p align="center"> 表 <id> 将数据结构与算法类比为积木 </p>
|
||||
|
||||
| 数据结构与算法 | 拼装积木 |
|
||||
| 数据结构与算法 | 拼装积木 |
|
||||
| -------------- | ---------------------------------------- |
|
||||
| 输入数据 | 未拼装的积木 |
|
||||
| 数据结构 | 积木组织形式,包括形状、大小、连接方式等 |
|
||||
|
||||
@@ -10,10 +10,10 @@
|
||||
|
||||
<p align="center"> 表 <id> 双向队列操作效率 </p>
|
||||
|
||||
| 方法名 | 描述 | 时间复杂度 |
|
||||
| ----------- | -------------- | ---------- |
|
||||
| pushFirst() | 将元素添加至队首 | $O(1)$ |
|
||||
| pushLast() | 将元素添加至队尾 | $O(1)$ |
|
||||
| 方法名 | 描述 | 时间复杂度 |
|
||||
| ----------- | ---------------- | ---------- |
|
||||
| pushFirst() | 将元素添加至队首 | $O(1)$ |
|
||||
| pushLast() | 将元素添加至队尾 | $O(1)$ |
|
||||
| popFirst() | 删除队首元素 | $O(1)$ |
|
||||
| popLast() | 删除队尾元素 | $O(1)$ |
|
||||
| peekFirst() | 访问队首元素 | $O(1)$ |
|
||||
|
||||
@@ -12,11 +12,11 @@
|
||||
|
||||
<p align="center"> 表 <id> 队列操作效率 </p>
|
||||
|
||||
| 方法名 | 描述 | 时间复杂度 |
|
||||
| --------- | -------------------------- | -------- |
|
||||
| push() | 元素入队,即将元素添加至队尾 | $O(1)$ |
|
||||
| pop() | 队首元素出队 | $O(1)$ |
|
||||
| peek() | 访问队首元素 | $O(1)$ |
|
||||
| 方法名 | 描述 | 时间复杂度 |
|
||||
| ------ | ---------------------------- | ---------- |
|
||||
| push() | 元素入队,即将元素添加至队尾 | $O(1)$ |
|
||||
| pop() | 队首元素出队 | $O(1)$ |
|
||||
| peek() | 访问队首元素 | $O(1)$ |
|
||||
|
||||
我们可以直接使用编程语言中现成的队列类。
|
||||
|
||||
|
||||
@@ -14,11 +14,11 @@
|
||||
|
||||
<p align="center"> 表 <id> 栈的操作效率 </p>
|
||||
|
||||
| 方法 | 描述 | 时间复杂度 |
|
||||
| --------- | ---------------------- | ---------- |
|
||||
| push() | 元素入栈(添加至栈顶) | $O(1)$ |
|
||||
| pop() | 栈顶元素出栈 | $O(1)$ |
|
||||
| peek() | 访问栈顶元素 | $O(1)$ |
|
||||
| 方法 | 描述 | 时间复杂度 |
|
||||
| ------ | ---------------------- | ---------- |
|
||||
| push() | 元素入栈(添加至栈顶) | $O(1)$ |
|
||||
| pop() | 栈顶元素出栈 | $O(1)$ |
|
||||
| peek() | 访问栈顶元素 | $O(1)$ |
|
||||
|
||||
通常情况下,我们可以直接使用编程语言内置的栈类。然而,某些语言可能没有专门提供栈类,这时我们可以将该语言的“数组”或“链表”视作栈来使用,并在程序逻辑上忽略与栈无关的操作。
|
||||
|
||||
|
||||
@@ -295,12 +295,12 @@ AVL 树的特点在于“旋转”操作,它能够在不影响二叉树的中
|
||||
|
||||
<p align="center"> 表 <id> 四种旋转情况的选择条件 </p>
|
||||
|
||||
| 失衡节点的平衡因子 | 子节点的平衡因子 | 应采用的旋转方法 |
|
||||
| ---------------- | ---------------- | ---------------- |
|
||||
| 失衡节点的平衡因子 | 子节点的平衡因子 | 应采用的旋转方法 |
|
||||
| ------------------- | ---------------- | ---------------- |
|
||||
| $> 1$ (即左偏树) | $\geq 0$ | 右旋 |
|
||||
| $> 1$ (即左偏树) | $<0$ | 先左旋后右旋 |
|
||||
| $< -1$ (即右偏树) | $\leq 0$ | 左旋 |
|
||||
| $< -1$ (即右偏树) | $>0$ | 先右旋后左旋 |
|
||||
| $< -1$ (即右偏树) | $\leq 0$ | 左旋 |
|
||||
| $< -1$ (即右偏树) | $>0$ | 先右旋后左旋 |
|
||||
|
||||
为了便于使用,我们将旋转操作封装成一个函数。**有了这个函数,我们就能对各种失衡情况进行旋转,使失衡节点重新恢复平衡**。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user