diff --git a/chapter_heap/heap.md b/chapter_heap/heap.md
index 4aeef1672..9fe8f15c6 100644
--- a/chapter_heap/heap.md
+++ b/chapter_heap/heap.md
@@ -25,17 +25,17 @@ comments: true
而恰好,**堆的定义与优先队列的操作逻辑完全吻合**,大顶堆就是一个元素从大到小出队的优先队列。从使用角度看,我们可以将「优先队列」和「堆」理解为等价的数据结构。因此,本文与代码对两者不做特别区分,统一使用「堆」来命名。
-堆的常用操作见下表(方法命名以 Java 为例)。
+堆的常用操作见下表,方法名需根据编程语言确定。
-| 方法 | 描述 | 时间复杂度 |
-| --------- | -------------------------------------------- | ----------- |
-| add() | 元素入堆 | $O(\log n)$ |
-| poll() | 堆顶元素出堆 | $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)$ |
@@ -55,11 +55,11 @@ comments: true
Queue maxHeap = new PriorityQueue<>((a, b) -> b - a);
/* 元素入堆 */
- maxHeap.add(1);
- maxHeap.add(3);
- maxHeap.add(2);
- maxHeap.add(5);
- maxHeap.add(4);
+ maxHeap.offer(1);
+ maxHeap.offer(3);
+ maxHeap.offer(2);
+ maxHeap.offer(5);
+ maxHeap.offer(4);
/* 获取堆顶元素 */
int peek = maxHeap.peek(); // 5
@@ -223,11 +223,11 @@ comments: true
/* 堆顶元素出堆 */
// 调用 heap.Interface 的方法,来移除元素
- heap.Pop(maxHeap)
- heap.Pop(maxHeap)
- heap.Pop(maxHeap)
- heap.Pop(maxHeap)
- heap.Pop(maxHeap)
+ heap.Pop(maxHeap) // 5
+ heap.Pop(maxHeap) // 4
+ heap.Pop(maxHeap) // 3
+ heap.Pop(maxHeap) // 2
+ heap.Pop(maxHeap) // 1
/* 获取堆大小 */
size := len(*maxHeap)
@@ -242,13 +242,13 @@ comments: true
=== "JavaScript"
```javascript title="heap.js"
- // JavaScript 未提供内置 heap 类
+ // JavaScript 未提供内置 Heap 类
```
=== "TypeScript"
```typescript title="heap.ts"
- // TypeScript 未提供内置堆 Heap 类
+ // TypeScript 未提供内置 Heap 类
```
=== "C"
@@ -297,7 +297,7 @@ comments: true
=== "Swift"
```swift title="heap.swift"
- // Swift 未提供内置 heap 类
+ // Swift 未提供内置 Heap 类
```
=== "Zig"
@@ -887,34 +887,34 @@ comments: true
顾名思义,**从顶至底堆化的操作方向与从底至顶堆化相反**,我们比较根结点的值与其两个子结点的值,将最大的子结点与根结点执行交换,并循环以上操作,直到越过叶结点时结束,或当遇到无需交换的结点时提前结束。
=== "<1>"
- 
+ 
=== "<2>"
- 
+ 
=== "<3>"
- 
+ 
=== "<4>"
- 
+ 
=== "<5>"
- 
+ 
=== "<6>"
- 
+ 
=== "<7>"
- 
+ 
=== "<8>"
- 
+ 
=== "<9>"
- 
+ 
=== "<10>"
- 
+ 
与元素入堆操作类似,**堆顶元素出堆操作的时间复杂度为 $O(\log n)$** 。
@@ -922,7 +922,7 @@ comments: true
```java title="my_heap.java"
/* 元素出堆 */
- int poll() {
+ int pop() {
// 判空处理
if (isEmpty())
throw new EmptyStackException();
@@ -959,7 +959,7 @@ comments: true
```cpp title="my_heap.cpp"
/* 元素出堆 */
- void poll() {
+ void pop() {
// 判空处理
if (empty()) {
throw out_of_range("堆为空");
@@ -995,7 +995,7 @@ comments: true
=== "Python"
```python title="my_heap.py"
- def poll(self) -> int:
+ def pop(self) -> int:
""" 元素出堆 """
# 判空处理
assert not self.is_empty()
@@ -1030,7 +1030,7 @@ comments: true
```go title="my_heap.go"
/* 元素出堆 */
- func (h *maxHeap) poll() any {
+ func (h *maxHeap) pop() any {
// 判空处理
if h.isEmpty() {
fmt.Println("error")
@@ -1075,7 +1075,7 @@ comments: true
```javascript title="my_heap.js"
/* 元素出堆 */
- poll() {
+ pop() {
// 判空处理
if (this.isEmpty()) throw new Error("堆为空");
// 交换根结点与最右叶结点(即交换首元素与尾元素)
@@ -1111,7 +1111,7 @@ comments: true
```typescript title="my_heap.ts"
/* 元素出堆 */
- poll(): number {
+ pop(): number {
// 判空处理
if (this.isEmpty()) throw new RangeError('Heap is empty.');
// 交换根结点与最右叶结点(即交换首元素与尾元素)
@@ -1146,7 +1146,7 @@ comments: true
=== "C"
```c title="my_heap.c"
- [class]{maxHeap}-[func]{poll}
+ [class]{maxHeap}-[func]{pop}
[class]{maxHeap}-[func]{siftDown}
```
@@ -1155,7 +1155,7 @@ comments: true
```csharp title="my_heap.cs"
/* 元素出堆 */
- int poll()
+ int pop()
{
// 判空处理
if (isEmpty())
@@ -1196,7 +1196,7 @@ comments: true
```swift title="my_heap.swift"
/* 元素出堆 */
- func poll() -> Int {
+ func pop() -> Int {
// 判空处理
if isEmpty() {
fatalError("堆为空")
@@ -1241,7 +1241,7 @@ comments: true
```zig title="my_heap.zig"
// 元素出堆
- fn poll(self: *Self) !T {
+ fn pop(self: *Self) !T {
// 判断处理
if (self.isEmpty()) unreachable;
// 交换根结点与最右叶结点(即交换首元素与尾元素)
diff --git a/chapter_stack_and_queue/deque.md b/chapter_stack_and_queue/deque.md
index e93787f45..9a29d1511 100644
--- a/chapter_stack_and_queue/deque.md
+++ b/chapter_stack_and_queue/deque.md
@@ -1204,7 +1204,7 @@ comments: true
front: ?*ListNode(T) = null, // 头结点 front
rear: ?*ListNode(T) = null, // 尾结点 rear
- deqSize: usize = 0, // 双向队列的长度
+ que_size: usize = 0, // 双向队列的长度
mem_arena: ?std.heap.ArenaAllocator = null,
mem_allocator: std.mem.Allocator = undefined, // 内存分配器
@@ -1216,7 +1216,7 @@ comments: true
}
self.front = null;
self.rear = null;
- self.deqSize = 0;
+ self.que_size = 0;
}
// 析构方法(释放内存)
@@ -1227,7 +1227,7 @@ comments: true
// 获取双向队列的长度
pub fn size(self: *Self) usize {
- return self.deqSize;
+ return self.que_size;
}
// 判断双向队列是否为空
@@ -1236,7 +1236,7 @@ comments: true
}
// 入队操作
- pub fn push(self: *Self, num: T, isFront: bool) !void {
+ pub fn push(self: *Self, num: T, is_front: bool) !void {
var node = try self.mem_allocator.create(ListNode(T));
node.init(num);
// 若链表为空,则令 front, rear 都指向 node
@@ -1244,7 +1244,7 @@ comments: true
self.front = node;
self.rear = node;
// 队首入队操作
- } else if (isFront) {
+ } else if (is_front) {
// 将 node 添加至链表头部
self.front.?.prev = node;
node.next = self.front;
@@ -1256,7 +1256,7 @@ comments: true
node.prev = self.rear;
self.rear = node; // 更新尾结点
}
- self.deqSize += 1; // 更新队列长度
+ self.que_size += 1; // 更新队列长度
}
// 队首入队
@@ -1270,11 +1270,11 @@ comments: true
}
// 出队操作
- pub fn pop(self: *Self, isFront: bool) T {
+ pub fn pop(self: *Self, is_front: bool) T {
if (self.isEmpty()) @panic("双向队列为空");
var val: T = undefined;
// 队首出队操作
- if (isFront) {
+ if (is_front) {
val = self.front.?.val; // 暂存头结点值
// 删除头结点
var fNext = self.front.?.next;
@@ -1294,7 +1294,7 @@ comments: true
}
self.rear = rPrev; // 更新尾结点
}
- self.deqSize -= 1; // 更新队列长度
+ self.que_size -= 1; // 更新队列长度
return val;
}
@@ -1320,7 +1320,7 @@ comments: true
return self.rear.?.val;
}
- // 将链表转换为数组
+ // 返回数组用于打印
pub fn toArray(self: *Self) ![]T {
var node = self.front;
var res = try self.mem_allocator.alloc(T, self.size());
@@ -1332,19 +1332,6 @@ comments: true
}
return res;
}
-
- // 打印双向队列
- pub fn print(self: *Self) !void {
- var nums = try self.toArray();
- std.debug.print("[", .{});
- if (nums.len > 0) {
- for (nums) |num, j| {
- std.debug.print("{}{s}", .{num, if (j == nums.len - 1) "]" else " <-> " });
- }
- } else {
- std.debug.print("]", .{});
- }
- }
};
}
```
diff --git a/chapter_stack_and_queue/queue.md b/chapter_stack_and_queue/queue.md
index f0a1ab5ea..1e2353341 100755
--- a/chapter_stack_and_queue/queue.md
+++ b/chapter_stack_and_queue/queue.md
@@ -844,7 +844,7 @@ comments: true
front: ?*inc.ListNode(T) = null, // 头结点 front
rear: ?*inc.ListNode(T) = null, // 尾结点 rear
- queSize: usize = 0, // 队列的长度
+ que_size: usize = 0, // 队列的长度
mem_arena: ?std.heap.ArenaAllocator = null,
mem_allocator: std.mem.Allocator = undefined, // 内存分配器
@@ -856,7 +856,7 @@ comments: true
}
self.front = null;
self.rear = null;
- self.queSize = 0;
+ self.que_size = 0;
}
// 析构方法(释放内存)
@@ -867,7 +867,7 @@ comments: true
// 获取队列的长度
pub fn size(self: *Self) usize {
- return self.queSize;
+ return self.que_size;
}
// 判断队列是否为空
@@ -895,7 +895,7 @@ comments: true
self.rear.?.next = node;
self.rear = node;
}
- self.queSize += 1;
+ self.que_size += 1;
}
// 出队
@@ -903,7 +903,7 @@ comments: true
var num = self.peek();
// 删除头结点
self.front = self.front.?.next;
- self.queSize -= 1;
+ self.que_size -= 1;
return num;
}
diff --git a/chapter_stack_and_queue/stack.md b/chapter_stack_and_queue/stack.md
index 3b3f9c8cd..346ceb3ec 100755
--- a/chapter_stack_and_queue/stack.md
+++ b/chapter_stack_and_queue/stack.md
@@ -770,8 +770,8 @@ comments: true
return struct {
const Self = @This();
- stackTop: ?*inc.ListNode(T) = null, // 将头结点作为栈顶
- stkSize: usize = 0, // 栈的长度
+ stack_top: ?*inc.ListNode(T) = null, // 将头结点作为栈顶
+ stk_size: usize = 0, // 栈的长度
mem_arena: ?std.heap.ArenaAllocator = null,
mem_allocator: std.mem.Allocator = undefined, // 内存分配器
@@ -781,8 +781,8 @@ comments: true
self.mem_arena = std.heap.ArenaAllocator.init(allocator);
self.mem_allocator = self.mem_arena.?.allocator();
}
- self.stackTop = null;
- self.stkSize = 0;
+ self.stack_top = null;
+ self.stk_size = 0;
}
// 析构方法(释放内存)
@@ -793,7 +793,7 @@ comments: true
// 获取栈的长度
pub fn size(self: *Self) usize {
- return self.stkSize;
+ return self.stk_size;
}
// 判断栈是否为空
@@ -802,31 +802,31 @@ comments: true
}
// 访问栈顶元素
- pub fn top(self: *Self) T {
+ pub fn peek(self: *Self) T {
if (self.size() == 0) @panic("栈为空");
- return self.stackTop.?.val;
+ return self.stack_top.?.val;
}
// 入栈
pub fn push(self: *Self, num: T) !void {
var node = try self.mem_allocator.create(inc.ListNode(T));
node.init(num);
- node.next = self.stackTop;
- self.stackTop = node;
- self.stkSize += 1;
+ node.next = self.stack_top;
+ self.stack_top = node;
+ self.stk_size += 1;
}
// 出栈
pub fn pop(self: *Self) T {
- var num = self.top();
- self.stackTop = self.stackTop.?.next;
- self.stkSize -= 1;
+ var num = self.peek();
+ self.stack_top = self.stack_top.?.next;
+ self.stk_size -= 1;
return num;
}
// 将栈转换为数组
pub fn toArray(self: *Self) ![]T {
- var node = self.stackTop;
+ var node = self.stack_top;
var res = try self.mem_allocator.alloc(T, self.size());
std.mem.set(T, res, @as(T, 0));
var i: usize = 0;
diff --git a/chapter_tree/binary_tree_traversal.md b/chapter_tree/binary_tree_traversal.md
index 762ac68cd..e47313fd3 100755
--- a/chapter_tree/binary_tree_traversal.md
+++ b/chapter_tree/binary_tree_traversal.md
@@ -97,7 +97,7 @@ comments: true
// 初始化一个切片,用于保存遍历序列
nums := make([]int, 0)
for queue.Len() > 0 {
- // poll
+ // 队列出队
node := queue.Remove(queue.Front()).(*TreeNode)
// 保存结点值
nums = append(nums, node.Val)