Introduction
Finding data quickly in large databases is a big challenge. B+ trees help solve this by organizing data so searches, insertions, and deletions happen fast and efficiently.
Imagine a large library where books are sorted by topic. The main shelves only have labels pointing to sections, while the actual books are in the reading area arranged in order. To find a book, you first look at the labels to find the right section, then browse the books in order. If a shelf gets too full, it is split into two shelves with a new label added to the main guide.
┌─────────────┐ │ Root Node │ │ [10, 20] │ └─────┬───────┘ │ ┌────┴─────┐ ┌─────────────┐ ┌─────────────┐ │ Internal │ │ Internal │ │ Internal │ │ Node [5] │ │ Node [15] │ │ Node [25] │ └────┬─────┘ └─────┬───────┘ └─────┬───────┘ │ │ │ ┌────┴───┐ ┌─────┴────┐ ┌─────┴────┐ │ Leaf │ │ Leaf │ │ Leaf │ │ Nodes │ │ Nodes │ │ Nodes │ │[1..4] │ │[6..14] │ │[16..30] │ └────────┘ └──────────┘ └──────────┘
class BPlusTreeNode: def __init__(self, leaf=False): self.leaf = leaf self.keys = [] self.children = [] class BPlusTree: def __init__(self, order=4): self.root = BPlusTreeNode(leaf=True) self.order = order def search(self, key, node=None): if node is None: node = self.root if node.leaf: for i, item in enumerate(node.keys): if item == key: return True return False else: for i, item in enumerate(node.keys): if key < item: return self.search(key, node.children[i]) return self.search(key, node.children[-1]) # Example usage bpt = BPlusTree() bpt.root.keys = [10, 20] bpt.root.leaf = False left_leaf = BPlusTreeNode(leaf=True) left_leaf.keys = [1, 5, 9] middle_leaf = BPlusTreeNode(leaf=True) middle_leaf.keys = [12, 15, 18] right_leaf = BPlusTreeNode(leaf=True) right_leaf.keys = [22, 25, 30] bpt.root.children = [left_leaf, middle_leaf, right_leaf] print(bpt.search(15)) print(bpt.search(7))