From bb84df27cfbf32f05852ece0c33f21d544cb8ac4 Mon Sep 17 00:00:00 2001 From: sjinzh <99076655+sjinzh@users.noreply.github.com> Date: Sat, 14 Jan 2023 20:47:03 +0800 Subject: [PATCH 01/10] fix bugs in java codes using JDK 1.8.0 --- codes/java/chapter_tree/binary_tree_bfs.java | 2 +- codes/java/include/TreeNode.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/codes/java/chapter_tree/binary_tree_bfs.java b/codes/java/chapter_tree/binary_tree_bfs.java index ffeb352e..81895dd4 100644 --- a/codes/java/chapter_tree/binary_tree_bfs.java +++ b/codes/java/chapter_tree/binary_tree_bfs.java @@ -13,7 +13,7 @@ public class binary_tree_bfs { /* 层序遍历 */ static List hierOrder(TreeNode root) { // 初始化队列,加入根结点 - Queue queue = new LinkedList<>() {{ add(root); }}; + Queue queue = new LinkedList() {{ add(root); }}; // 初始化一个列表,用于保存遍历序列 List list = new ArrayList<>(); while (!queue.isEmpty()) { diff --git a/codes/java/include/TreeNode.java b/codes/java/include/TreeNode.java index 22a34974..5a87e8a7 100644 --- a/codes/java/include/TreeNode.java +++ b/codes/java/include/TreeNode.java @@ -32,7 +32,7 @@ public class TreeNode { return null; TreeNode root = new TreeNode(list.get(0)); - Queue queue = new LinkedList<>() {{ add(root); }}; + Queue queue = new LinkedList() {{ add(root); }}; int i = 0; while(!queue.isEmpty()) { TreeNode node = queue.poll(); @@ -58,7 +58,7 @@ public class TreeNode { public static List treeToList(TreeNode root) { List list = new ArrayList<>(); if(root == null) return list; - Queue queue = new LinkedList<>() {{ add(root); }}; + Queue queue = new LinkedList() {{ add(root); }}; while(!queue.isEmpty()) { TreeNode node = queue.poll(); if(node != null) { From 5bda3dd91f107d49acb150eee244f00b22782163 Mon Sep 17 00:00:00 2001 From: sjinzh <99076655+sjinzh@users.noreply.github.com> Date: Sat, 14 Jan 2023 22:28:23 +0800 Subject: [PATCH 02/10] add zig codes for Section 'Heap' (heap.zig) --- codes/zig/build.zig | 16 ++++++- codes/zig/chapter_heap/heap.zig | 84 +++++++++++++++++++++++++++++++++ codes/zig/include/TreeNode.zig | 22 ++++----- 3 files changed, 107 insertions(+), 15 deletions(-) create mode 100644 codes/zig/chapter_heap/heap.zig diff --git a/codes/zig/build.zig b/codes/zig/build.zig index 4299c60f..85119b8f 100644 --- a/codes/zig/build.zig +++ b/codes/zig/build.zig @@ -187,7 +187,21 @@ pub fn build(b: *std.build.Builder) void { if (b.args) |args| run_cmd_binary_tree.addArgs(args); const run_step_binary_tree= b.step("run_binary_tree", "Run binary_tree"); run_step_binary_tree.dependOn(&run_cmd_binary_tree.step); - + + // Section: "Heap" + // Source File: "chapter_heap/heap.zig" + // Run Command: zig build run_heap + const exe_heap = b.addExecutable("heap", "chapter_heap/heap.zig"); + exe_heap.addPackagePath("include", "include/include.zig"); + exe_heap.setTarget(target); + exe_heap.setBuildMode(mode); + exe_heap.install(); + const run_cmd_heap = exe_heap.run(); + run_cmd_heap.step.dependOn(b.getInstallStep()); + if (b.args) |args| run_cmd_heap.addArgs(args); + const run_step_heap = b.step("run_heap", "Run heap"); + run_step_heap.dependOn(&run_cmd_heap.step); + // Section: "Linear Search" // Source File: "chapter_searching/linear_search.zig" // Run Command: zig build run_linear_search diff --git a/codes/zig/chapter_heap/heap.zig b/codes/zig/chapter_heap/heap.zig new file mode 100644 index 00000000..1f4162a5 --- /dev/null +++ b/codes/zig/chapter_heap/heap.zig @@ -0,0 +1,84 @@ +// File: heap.zig +// Created Time: 2023-01-14 +// Author: sjinzh (sjinzh@gmail.com) + +const std = @import("std"); +const inc = @import("include"); + +fn lessThan(context: void, a: i32, b: i32) std.math.Order { + _ = context; + return std.math.order(a, b); +} + +fn greaterThan(context: void, a: i32, b: i32) std.math.Order { + return lessThan(context, a, b).invert(); +} + +fn testPush(comptime T: type, mem_allocator: std.mem.Allocator, heap_push: anytype, val: T) !void { + var heap = heap_push; + try heap.add(val); //元素入堆 + std.debug.print("\n元素 {} 入堆后\n", .{val}); + try inc.PrintUtil.printHeap(T, mem_allocator, heap); +} + +fn testPop(comptime T: type, mem_allocator: std.mem.Allocator, heap_pop: anytype) !void { + var val = heap_pop.remove(); //堆顶元素出堆 + std.debug.print("\n堆顶元素 {} 出堆后\n", .{val}); + try inc.PrintUtil.printHeap(T, mem_allocator, heap_pop); +} + +// Driver Code +pub fn main() !void { + // 初始化内存分配器 + var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer mem_arena.deinit(); + const mem_allocator = mem_arena.allocator(); + + // 初始化堆 + // 初始化小顶堆 + const PQlt = std.PriorityQueue(i32, void, lessThan); + var minHeap = PQlt.init(std.heap.page_allocator, {}); + defer minHeap.deinit(); + // 初始化大顶堆 + const PQgt = std.PriorityQueue(i32, void, greaterThan); + var maxHeap = PQgt.init(std.heap.page_allocator, {}); + defer maxHeap.deinit(); + + std.debug.print("\n以下测试样例为大顶堆", .{}); + + // 元素入堆 + try testPush(i32, mem_allocator, &maxHeap, 1); + try testPush(i32, mem_allocator, &maxHeap, 3); + try testPush(i32, mem_allocator, &maxHeap, 2); + try testPush(i32, mem_allocator, &maxHeap, 5); + try testPush(i32, mem_allocator, &maxHeap, 4); + + // 获取堆顶元素 + var peek = maxHeap.peek().?; + std.debug.print("\n堆顶元素为 {}\n", .{peek}); + + // 堆顶元素出堆 + try testPop(i32, mem_allocator, &maxHeap); + try testPop(i32, mem_allocator, &maxHeap); + try testPop(i32, mem_allocator, &maxHeap); + try testPop(i32, mem_allocator, &maxHeap); + try testPop(i32, mem_allocator, &maxHeap); + + // 获取堆的大小 + var size = maxHeap.len; + std.debug.print("\n堆元素数量为 {}\n", .{size}); + + // 判断堆是否为空 + var isEmpty = if (maxHeap.len == 0) true else false; + std.debug.print("\n堆是否为空 {}\n", .{isEmpty}); + + // 输入列表并建堆 + // 时间复杂度为 O(n) ,而非 O(nlogn) + try minHeap.addSlice(&[_]i32{ 1, 3, 2, 5, 4 }); + std.debug.print("\n输入列表并建立小顶堆后\n", .{}); + try inc.PrintUtil.printHeap(i32, mem_allocator, minHeap); + + const getchar = try std.io.getStdIn().reader().readByte(); + _ = getchar; +} + diff --git a/codes/zig/include/TreeNode.zig b/codes/zig/include/TreeNode.zig index 7c1e2ad2..a3715dbd 100644 --- a/codes/zig/include/TreeNode.zig +++ b/codes/zig/include/TreeNode.zig @@ -28,32 +28,26 @@ pub fn arrToTree(comptime T: type, mem_allocator: std.mem.Allocator, list: []T) if (list.len == 0) return null; var root = try mem_allocator.create(TreeNode(T)); root.init(list[0]); - - const TailQueue = std.TailQueue(?*TreeNode(T)); - const TailQueueNode = std.TailQueue(?*TreeNode(T)).Node; - var que = TailQueue{}; - var node_root = TailQueueNode{ .data = root }; - que.append(&node_root); + var que = std.ArrayList(*TreeNode(T)).init(std.heap.page_allocator); + try que.append(root); var index: usize = 0; - while (que.len > 0) { - var node = que.popFirst(); + while (que.items.len > 0) { + var node = que.orderedRemove(0); index += 1; if (index >= list.len) break; if (index < list.len) { var tmp = try mem_allocator.create(TreeNode(T)); tmp.init(list[index]); - node.?.data.?.left = tmp; - var a = TailQueueNode{ .data = node.?.data.?.left }; - que.append(&a); + node.left = tmp; + try que.append(node.left.?); } index += 1; if (index >= list.len) break; if (index < list.len) { var tmp = try mem_allocator.create(TreeNode(T)); tmp.init(list[index]); - node.?.data.?.right = tmp; - var a = TailQueueNode{ .data = node.?.data.?.right }; - que.append(&a); + node.right = tmp; + try que.append(node.right.?); } } return root; From bf907e17154f19dcae6663b71b0928b3c2591364 Mon Sep 17 00:00:00 2001 From: sjinzh <99076655+sjinzh@users.noreply.github.com> Date: Sat, 14 Jan 2023 22:30:56 +0800 Subject: [PATCH 03/10] add zig codes for Section 'Heap' (heap.zig) --- codes/java/chapter_tree/binary_tree_bfs.java | 2 +- codes/java/include/TreeNode.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/codes/java/chapter_tree/binary_tree_bfs.java b/codes/java/chapter_tree/binary_tree_bfs.java index 81895dd4..ffeb352e 100644 --- a/codes/java/chapter_tree/binary_tree_bfs.java +++ b/codes/java/chapter_tree/binary_tree_bfs.java @@ -13,7 +13,7 @@ public class binary_tree_bfs { /* 层序遍历 */ static List hierOrder(TreeNode root) { // 初始化队列,加入根结点 - Queue queue = new LinkedList() {{ add(root); }}; + Queue queue = new LinkedList<>() {{ add(root); }}; // 初始化一个列表,用于保存遍历序列 List list = new ArrayList<>(); while (!queue.isEmpty()) { diff --git a/codes/java/include/TreeNode.java b/codes/java/include/TreeNode.java index 5a87e8a7..22a34974 100644 --- a/codes/java/include/TreeNode.java +++ b/codes/java/include/TreeNode.java @@ -32,7 +32,7 @@ public class TreeNode { return null; TreeNode root = new TreeNode(list.get(0)); - Queue queue = new LinkedList() {{ add(root); }}; + Queue queue = new LinkedList<>() {{ add(root); }}; int i = 0; while(!queue.isEmpty()) { TreeNode node = queue.poll(); @@ -58,7 +58,7 @@ public class TreeNode { public static List treeToList(TreeNode root) { List list = new ArrayList<>(); if(root == null) return list; - Queue queue = new LinkedList() {{ add(root); }}; + Queue queue = new LinkedList<>() {{ add(root); }}; while(!queue.isEmpty()) { TreeNode node = queue.poll(); if(node != null) { From 5e17778f69efd028a5d358c92e04b38beec903ca Mon Sep 17 00:00:00 2001 From: sjinzh <99076655+sjinzh@users.noreply.github.com> Date: Sun, 15 Jan 2023 20:39:46 +0800 Subject: [PATCH 04/10] update zig codes for Section 'Heap' (heap.zig) --- codes/zig/chapter_heap/heap.zig | 11 +++--- codes/zig/include/PrintUtil.zig | 7 +++- codes/zig/include/TreeNode.zig | 70 +++++++++++++++++++++++++-------- 3 files changed, 64 insertions(+), 24 deletions(-) diff --git a/codes/zig/chapter_heap/heap.zig b/codes/zig/chapter_heap/heap.zig index 1f4162a5..d6e8f3e0 100644 --- a/codes/zig/chapter_heap/heap.zig +++ b/codes/zig/chapter_heap/heap.zig @@ -18,13 +18,13 @@ fn testPush(comptime T: type, mem_allocator: std.mem.Allocator, heap_push: anyty var heap = heap_push; try heap.add(val); //元素入堆 std.debug.print("\n元素 {} 入堆后\n", .{val}); - try inc.PrintUtil.printHeap(T, mem_allocator, heap); + try inc.PrintUtil.printHeap(T, mem_allocator, heap, true); } fn testPop(comptime T: type, mem_allocator: std.mem.Allocator, heap_pop: anytype) !void { var val = heap_pop.remove(); //堆顶元素出堆 std.debug.print("\n堆顶元素 {} 出堆后\n", .{val}); - try inc.PrintUtil.printHeap(T, mem_allocator, heap_pop); + try inc.PrintUtil.printHeap(T, mem_allocator, heap_pop, true); } // Driver Code @@ -74,11 +74,10 @@ pub fn main() !void { // 输入列表并建堆 // 时间复杂度为 O(n) ,而非 O(nlogn) - try minHeap.addSlice(&[_]i32{ 1, 3, 2, 5, 4 }); + try minHeap.addSlice(&[_]i32{ 1, 3, 2, 5, 4, 8, 9 }); std.debug.print("\n输入列表并建立小顶堆后\n", .{}); - try inc.PrintUtil.printHeap(i32, mem_allocator, minHeap); + try inc.PrintUtil.printHeap(i32, mem_allocator, minHeap, true); const getchar = try std.io.getStdIn().reader().readByte(); _ = getchar; -} - +} \ No newline at end of file diff --git a/codes/zig/include/PrintUtil.zig b/codes/zig/include/PrintUtil.zig index d126acb3..9858797c 100644 --- a/codes/zig/include/PrintUtil.zig +++ b/codes/zig/include/PrintUtil.zig @@ -59,13 +59,16 @@ pub fn printHashMap(comptime TKey: type, comptime TValue: type, map: std.AutoHas } // print a heap (PriorityQueue) -pub fn printHeap(comptime T: type, mem_allocator: std.mem.Allocator, queue: anytype) !void { +pub fn printHeap(comptime T: type, mem_allocator: std.mem.Allocator, queue: anytype, queue_flag: bool) !void { var arr = queue.items; var len = queue.len; std.debug.print("堆的数组表示:", .{}); printArray(T, arr[0..len]); std.debug.print("\n堆的树状表示:\n", .{}); - var root = try TreeUtil.arrToTree(T, mem_allocator, arr[0..len]); + var root = if (queue_flag) + try TreeUtil.arrQueToTree(T, mem_allocator, arr[0..len]) // through TailQueue + else + try TreeUtil.arrListToTree(T, mem_allocator, arr[0..len]); // through ArrayList to work as queue try printTree(root, null, false); } diff --git a/codes/zig/include/TreeNode.zig b/codes/zig/include/TreeNode.zig index a3715dbd..b2498fb1 100644 --- a/codes/zig/include/TreeNode.zig +++ b/codes/zig/include/TreeNode.zig @@ -23,31 +23,69 @@ pub fn TreeNode(comptime T: type) type { }; } -// Generate a binary tree with an array -pub fn arrToTree(comptime T: type, mem_allocator: std.mem.Allocator, list: []T) !?*TreeNode(T) { - if (list.len == 0) return null; +// Generate a binary tree with an array (through ArrayList to work as queue) +pub fn arrListToTree(comptime T: type, mem_allocator: std.mem.Allocator, arr: []T) !?*TreeNode(T) { + if (arr.len == 0) return null; var root = try mem_allocator.create(TreeNode(T)); - root.init(list[0]); - var que = std.ArrayList(*TreeNode(T)).init(std.heap.page_allocator); - try que.append(root); + root.init(arr[0]); + var list = std.ArrayList(*TreeNode(T)).init(std.heap.page_allocator); + try list.append(root); var index: usize = 0; - while (que.items.len > 0) { - var node = que.orderedRemove(0); + while (list.items.len > 0) { + var node = list.orderedRemove(0); index += 1; - if (index >= list.len) break; - if (index < list.len) { + if (index >= arr.len) break; + if (index < arr.len) { var tmp = try mem_allocator.create(TreeNode(T)); - tmp.init(list[index]); + tmp.init(arr[index]); node.left = tmp; - try que.append(node.left.?); + try list.append(node.left.?); } index += 1; - if (index >= list.len) break; - if (index < list.len) { + if (index >= arr.len) break; + if (index < arr.len) { var tmp = try mem_allocator.create(TreeNode(T)); - tmp.init(list[index]); + tmp.init(arr[index]); node.right = tmp; - try que.append(node.right.?); + try list.append(node.right.?); + } + } + return root; +} + +// Generate a binary tree with an array (through TailQueue) +pub fn arrQueToTree(comptime T: type, mem_allocator: std.mem.Allocator, arr: []T) !?*TreeNode(T) { + if (arr.len == 0) return null; + var root = try mem_allocator.create(TreeNode(T)); + root.init(arr[0]); + const L = std.TailQueue(*TreeNode(T)); + var que = L{}; + var root_node = try mem_allocator.create(L.Node); + root_node.data = root; + que.append(root_node); + var index: usize = 0; + while (que.len > 0) { + var que_node = que.popFirst().?; + var node = que_node.data; + index += 1; + if (index >= arr.len) break; + if (index < arr.len) { + var tmp = try mem_allocator.create(TreeNode(T)); + tmp.init(arr[index]); + node.left = tmp; + var tmp_node = try mem_allocator.create(L.Node); + tmp_node.data = node.left.?; + que.append(tmp_node); + } + index += 1; + if (index >= arr.len) break; + if (index < arr.len) { + var tmp = try mem_allocator.create(TreeNode(T)); + tmp.init(arr[index]); + node.right = tmp; + var tmp_node = try mem_allocator.create(L.Node); + tmp_node.data = node.right.?; + que.append(tmp_node); } } return root; From d8289580a543e5a676437b7231e23f5970f117ec Mon Sep 17 00:00:00 2001 From: sjinzh <99076655+sjinzh@users.noreply.github.com> Date: Sun, 15 Jan 2023 20:57:01 +0800 Subject: [PATCH 05/10] update zig codes for Section 'Heap' (heap.zig) --- codes/zig/chapter_heap/heap.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codes/zig/chapter_heap/heap.zig b/codes/zig/chapter_heap/heap.zig index d6e8f3e0..fead5bff 100644 --- a/codes/zig/chapter_heap/heap.zig +++ b/codes/zig/chapter_heap/heap.zig @@ -74,7 +74,7 @@ pub fn main() !void { // 输入列表并建堆 // 时间复杂度为 O(n) ,而非 O(nlogn) - try minHeap.addSlice(&[_]i32{ 1, 3, 2, 5, 4, 8, 9 }); + try minHeap.addSlice(&[_]i32{ 1, 3, 2, 5, 4 }); std.debug.print("\n输入列表并建立小顶堆后\n", .{}); try inc.PrintUtil.printHeap(i32, mem_allocator, minHeap, true); From 73121c2cb38a0ff9778adb0a583eab32c135c5ab Mon Sep 17 00:00:00 2001 From: sjinzh <99076655+sjinzh@users.noreply.github.com> Date: Mon, 16 Jan 2023 00:05:56 +0800 Subject: [PATCH 06/10] update zig codes for Section 'Heap' (heap.zig) --- codes/zig/chapter_heap/heap.zig | 7 +++---- codes/zig/include/PrintUtil.zig | 7 ++----- codes/zig/include/TreeNode.zig | 30 ------------------------------ 3 files changed, 5 insertions(+), 39 deletions(-) diff --git a/codes/zig/chapter_heap/heap.zig b/codes/zig/chapter_heap/heap.zig index fead5bff..a375cf3c 100644 --- a/codes/zig/chapter_heap/heap.zig +++ b/codes/zig/chapter_heap/heap.zig @@ -18,13 +18,13 @@ fn testPush(comptime T: type, mem_allocator: std.mem.Allocator, heap_push: anyty var heap = heap_push; try heap.add(val); //元素入堆 std.debug.print("\n元素 {} 入堆后\n", .{val}); - try inc.PrintUtil.printHeap(T, mem_allocator, heap, true); + try inc.PrintUtil.printHeap(T, mem_allocator, heap); } fn testPop(comptime T: type, mem_allocator: std.mem.Allocator, heap_pop: anytype) !void { var val = heap_pop.remove(); //堆顶元素出堆 std.debug.print("\n堆顶元素 {} 出堆后\n", .{val}); - try inc.PrintUtil.printHeap(T, mem_allocator, heap_pop, true); + try inc.PrintUtil.printHeap(T, mem_allocator, heap_pop); } // Driver Code @@ -73,10 +73,9 @@ pub fn main() !void { std.debug.print("\n堆是否为空 {}\n", .{isEmpty}); // 输入列表并建堆 - // 时间复杂度为 O(n) ,而非 O(nlogn) try minHeap.addSlice(&[_]i32{ 1, 3, 2, 5, 4 }); std.debug.print("\n输入列表并建立小顶堆后\n", .{}); - try inc.PrintUtil.printHeap(i32, mem_allocator, minHeap, true); + try inc.PrintUtil.printHeap(i32, mem_allocator, minHeap); const getchar = try std.io.getStdIn().reader().readByte(); _ = getchar; diff --git a/codes/zig/include/PrintUtil.zig b/codes/zig/include/PrintUtil.zig index 9858797c..6e46c0de 100644 --- a/codes/zig/include/PrintUtil.zig +++ b/codes/zig/include/PrintUtil.zig @@ -59,16 +59,13 @@ pub fn printHashMap(comptime TKey: type, comptime TValue: type, map: std.AutoHas } // print a heap (PriorityQueue) -pub fn printHeap(comptime T: type, mem_allocator: std.mem.Allocator, queue: anytype, queue_flag: bool) !void { +pub fn printHeap(comptime T: type, mem_allocator: std.mem.Allocator, queue: anytype) !void { var arr = queue.items; var len = queue.len; std.debug.print("堆的数组表示:", .{}); printArray(T, arr[0..len]); std.debug.print("\n堆的树状表示:\n", .{}); - var root = if (queue_flag) - try TreeUtil.arrQueToTree(T, mem_allocator, arr[0..len]) // through TailQueue - else - try TreeUtil.arrListToTree(T, mem_allocator, arr[0..len]); // through ArrayList to work as queue + var root = try TreeUtil.arrQueToTree(T, mem_allocator, arr[0..len]); // through TailQueue try printTree(root, null, false); } diff --git a/codes/zig/include/TreeNode.zig b/codes/zig/include/TreeNode.zig index b2498fb1..17342186 100644 --- a/codes/zig/include/TreeNode.zig +++ b/codes/zig/include/TreeNode.zig @@ -23,36 +23,6 @@ pub fn TreeNode(comptime T: type) type { }; } -// Generate a binary tree with an array (through ArrayList to work as queue) -pub fn arrListToTree(comptime T: type, mem_allocator: std.mem.Allocator, arr: []T) !?*TreeNode(T) { - if (arr.len == 0) return null; - var root = try mem_allocator.create(TreeNode(T)); - root.init(arr[0]); - var list = std.ArrayList(*TreeNode(T)).init(std.heap.page_allocator); - try list.append(root); - var index: usize = 0; - while (list.items.len > 0) { - var node = list.orderedRemove(0); - index += 1; - if (index >= arr.len) break; - if (index < arr.len) { - var tmp = try mem_allocator.create(TreeNode(T)); - tmp.init(arr[index]); - node.left = tmp; - try list.append(node.left.?); - } - index += 1; - if (index >= arr.len) break; - if (index < arr.len) { - var tmp = try mem_allocator.create(TreeNode(T)); - tmp.init(arr[index]); - node.right = tmp; - try list.append(node.right.?); - } - } - return root; -} - // Generate a binary tree with an array (through TailQueue) pub fn arrQueToTree(comptime T: type, mem_allocator: std.mem.Allocator, arr: []T) !?*TreeNode(T) { if (arr.len == 0) return null; From 87949f6c207136df3fb0afc805e622d8ddaddbac Mon Sep 17 00:00:00 2001 From: sjinzh <99076655+sjinzh@users.noreply.github.com> Date: Mon, 16 Jan 2023 00:10:26 +0800 Subject: [PATCH 07/10] update zig codes for Section 'Heap' (heap.zig) --- codes/java/chapter_heap/heap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codes/java/chapter_heap/heap.java b/codes/java/chapter_heap/heap.java index 1a0c53b9..35ca6af0 100644 --- a/codes/java/chapter_heap/heap.java +++ b/codes/java/chapter_heap/heap.java @@ -1,5 +1,5 @@ /** - * File: my_heap.java + * File: heap.java * Created Time: 2023-01-07 * Author: Krahets (krahets@163.com) */ From 58d5c117f8ee0067e0709e25241e5443afbadc49 Mon Sep 17 00:00:00 2001 From: sjinzh <99076655+sjinzh@users.noreply.github.com> Date: Mon, 16 Jan 2023 05:30:46 +0800 Subject: [PATCH 08/10] update zig codes for Section 'Heap' (heap.zig) --- codes/zig/chapter_heap/heap.zig | 9 ++++----- codes/zig/include/PrintUtil.zig | 2 +- codes/zig/include/TreeNode.zig | 4 ++-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/codes/zig/chapter_heap/heap.zig b/codes/zig/chapter_heap/heap.zig index a375cf3c..e2f215d0 100644 --- a/codes/zig/chapter_heap/heap.zig +++ b/codes/zig/chapter_heap/heap.zig @@ -14,17 +14,16 @@ fn greaterThan(context: void, a: i32, b: i32) std.math.Order { return lessThan(context, a, b).invert(); } -fn testPush(comptime T: type, mem_allocator: std.mem.Allocator, heap_push: anytype, val: T) !void { - var heap = heap_push; +fn testPush(comptime T: type, mem_allocator: std.mem.Allocator, heap: anytype, val: T) !void { try heap.add(val); //元素入堆 std.debug.print("\n元素 {} 入堆后\n", .{val}); try inc.PrintUtil.printHeap(T, mem_allocator, heap); } -fn testPop(comptime T: type, mem_allocator: std.mem.Allocator, heap_pop: anytype) !void { - var val = heap_pop.remove(); //堆顶元素出堆 +fn testPop(comptime T: type, mem_allocator: std.mem.Allocator, heap: anytype) !void { + var val = heap.remove(); //堆顶元素出堆 std.debug.print("\n堆顶元素 {} 出堆后\n", .{val}); - try inc.PrintUtil.printHeap(T, mem_allocator, heap_pop); + try inc.PrintUtil.printHeap(T, mem_allocator, heap); } // Driver Code diff --git a/codes/zig/include/PrintUtil.zig b/codes/zig/include/PrintUtil.zig index 6e46c0de..6cfeaa6a 100644 --- a/codes/zig/include/PrintUtil.zig +++ b/codes/zig/include/PrintUtil.zig @@ -65,7 +65,7 @@ pub fn printHeap(comptime T: type, mem_allocator: std.mem.Allocator, queue: anyt std.debug.print("堆的数组表示:", .{}); printArray(T, arr[0..len]); std.debug.print("\n堆的树状表示:\n", .{}); - var root = try TreeUtil.arrQueToTree(T, mem_allocator, arr[0..len]); // through TailQueue + var root = try TreeUtil.arrToTree(T, mem_allocator, arr[0..len]); // through TailQueue try printTree(root, null, false); } diff --git a/codes/zig/include/TreeNode.zig b/codes/zig/include/TreeNode.zig index 17342186..0e4f5b15 100644 --- a/codes/zig/include/TreeNode.zig +++ b/codes/zig/include/TreeNode.zig @@ -23,8 +23,8 @@ pub fn TreeNode(comptime T: type) type { }; } -// Generate a binary tree with an array (through TailQueue) -pub fn arrQueToTree(comptime T: type, mem_allocator: std.mem.Allocator, arr: []T) !?*TreeNode(T) { +// Generate a binary tree with an array +pub fn arrToTree(comptime T: type, mem_allocator: std.mem.Allocator, arr: []T) !?*TreeNode(T) { if (arr.len == 0) return null; var root = try mem_allocator.create(TreeNode(T)); root.init(arr[0]); From a634b493781c41923b3392f3e41e2773d696ccc7 Mon Sep 17 00:00:00 2001 From: sjinzh <99076655+sjinzh@users.noreply.github.com> Date: Mon, 16 Jan 2023 06:15:19 +0800 Subject: [PATCH 09/10] update zig codes for Section 'Heap' (heap.zig) --- codes/zig/include/PrintUtil.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codes/zig/include/PrintUtil.zig b/codes/zig/include/PrintUtil.zig index 6cfeaa6a..f501e169 100644 --- a/codes/zig/include/PrintUtil.zig +++ b/codes/zig/include/PrintUtil.zig @@ -65,7 +65,7 @@ pub fn printHeap(comptime T: type, mem_allocator: std.mem.Allocator, queue: anyt std.debug.print("堆的数组表示:", .{}); printArray(T, arr[0..len]); std.debug.print("\n堆的树状表示:\n", .{}); - var root = try TreeUtil.arrToTree(T, mem_allocator, arr[0..len]); // through TailQueue + var root = try TreeUtil.arrToTree(T, mem_allocator, arr[0..len]); try printTree(root, null, false); } From 54ca41a896bce77f978c164e22474f5d75d3f588 Mon Sep 17 00:00:00 2001 From: sjinzh <99076655+sjinzh@users.noreply.github.com> Date: Mon, 16 Jan 2023 06:16:20 +0800 Subject: [PATCH 10/10] update zig codes for Section 'Heap' (heap.zig) --- codes/zig/include/PrintUtil.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codes/zig/include/PrintUtil.zig b/codes/zig/include/PrintUtil.zig index f501e169..d126acb3 100644 --- a/codes/zig/include/PrintUtil.zig +++ b/codes/zig/include/PrintUtil.zig @@ -65,7 +65,7 @@ pub fn printHeap(comptime T: type, mem_allocator: std.mem.Allocator, queue: anyt std.debug.print("堆的数组表示:", .{}); printArray(T, arr[0..len]); std.debug.print("\n堆的树状表示:\n", .{}); - var root = try TreeUtil.arrToTree(T, mem_allocator, arr[0..len]); + var root = try TreeUtil.arrToTree(T, mem_allocator, arr[0..len]); try printTree(root, null, false); }