72 lines
2.3 KiB
Zig
72 lines
2.3 KiB
Zig
const std = @import("std");
|
|
const zirb = @import("generic_red_black_tree.zig");
|
|
|
|
// Define the data structure to be stored in the tree.
|
|
const MyData = struct {
|
|
id: u32,
|
|
name: []const u8,
|
|
};
|
|
|
|
// Define the comparison function for MyData.
|
|
fn compareMyData(context: void, lhs: MyData, rhs: MyData) std.math.Order {
|
|
_ = context;
|
|
return std.math.order(lhs.id, rhs.id);
|
|
}
|
|
|
|
// Define the tree type using the generic RedBlackTree.
|
|
const MyTree = zirb.RedBlackTree(MyData, void, compareMyData);
|
|
|
|
pub fn main() !void {
|
|
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
|
defer _ = gpa.deinit();
|
|
const allocator = gpa.allocator();
|
|
|
|
// Initialize the tree.
|
|
var tree = MyTree{ .context = {} };
|
|
|
|
// Create and insert nodes.
|
|
const data_to_insert = [_]MyData{
|
|
.{ .id = 10, .name = "ten" },
|
|
.{ .id = 5, .name = "five" },
|
|
.{ .id = 15, .name = "fifteen" },
|
|
.{ .id = 1, .name = "one" },
|
|
.{ .id = 7, .name = "seven" },
|
|
};
|
|
|
|
var nodes = std.ArrayList(MyTree.Node).empty;
|
|
try nodes.ensureTotalCapacity(allocator, data_to_insert.len);
|
|
defer nodes.deinit(allocator);
|
|
|
|
std.debug.print("Inserting nodes...\n", .{});
|
|
for (data_to_insert, 0..) |data, i| {
|
|
nodes.appendAssumeCapacity(.{ .payload = .{
|
|
.id = data.id,
|
|
.name = data.name,
|
|
} });
|
|
tree.insert(&nodes.items[i]);
|
|
std.debug.print("\tInserted: id = {d}, name = {s}\n", .{ data.id, data.name });
|
|
}
|
|
|
|
// Iterate over the tree in order and print the data.
|
|
std.debug.print("\nIn-order traversal:\n", .{});
|
|
var it = tree.inorder();
|
|
while (it.next()) |node| {
|
|
std.debug.print("\tid = {d}, name = {s}\n", .{ node.payload.id, node.payload.name });
|
|
}
|
|
|
|
// Find and remove a node.
|
|
std.debug.print("\nRemoving node with id = 10...\n", .{});
|
|
const node_to_remove = tree.search(.{ .id = 10, .name = "" }) orelse {
|
|
std.debug.print("Node not found!\n", .{});
|
|
return;
|
|
};
|
|
tree.remove(node_to_remove);
|
|
|
|
// Iterate again to show the node has been removed.
|
|
std.debug.print("\nIn-order traversal after removal:\n", .{});
|
|
var it_after_remove = tree.inorder();
|
|
while (it_after_remove.next()) |node| {
|
|
std.debug.print("\tid = {d}, name = {s}\n", .{ node.payload.id, node.payload.name });
|
|
}
|
|
}
|