This commit is contained in:
bronku 2025-12-06 20:26:29 +01:00
parent be9e685b94
commit 4d3fdcb356
6 changed files with 397 additions and 153 deletions

63
src/btree.rs Normal file
View file

@ -0,0 +1,63 @@
use crate::node::Node;
use crate::record::Record;
#[derive(Debug)]
pub struct BTree {
root: Option<Box<Node>>,
}
impl BTree {
pub fn new() -> Self {
BTree { root: None }
}
pub fn insert(&mut self, rec: Record) {
match &mut self.root {
None => {
let mut root = Box::new(Node::new(true));
root.keys.push(rec);
self.root = Some(root);
}
Some(root) => {
if root.is_full() {
let mut new_root = Box::new(Node::new(false));
let old_root = self.root.take().unwrap();
new_root.children.push(old_root);
new_root.split_child(0);
new_root.insert_non_full(rec);
self.root = Some(new_root);
} else {
root.insert_non_full(rec);
}
}
}
}
pub fn search(&self, key: i32) -> Option<Record> {
match &self.root {
None => None,
Some(root) => root.search(key),
}
}
pub fn print_tree(&self) {
if let Some(root) = &self.root {
Self::print_node(root, 0);
} else {
println!("Empty tree");
}
}
fn print_node(node: &Node, level: usize) {
print!("{}", " ".repeat(level));
let key_values: Vec<i32> = node.keys.iter().map(|r| r.key).collect();
println!("Keys: {:?}", key_values);
if !node.is_leaf {
for child in &node.children {
Self::print_node(child, level + 1);
}
}
}
}