Navigation

Iterative Recursive Array-Based

Binary Search Tree (BST) Implementations

1. Iterative BST Implementation


class Node: def __init__(self, data): self.data = data self.left = None self.right = None class BST: def __init__(self): self.root = None def insert(self, data): node = Node(data) if self.root is None: self.root = node return else: cur = self.root while cur: if cur.data > data: if cur.left is None: cur.left = node return else: cur = cur.left else: if cur.right is None: cur.right = node return else: cur = cur.right def search(self, data): if self.root is None: return 'empty bst' else: cur = self.root while cur: if cur.data == data: return True elif cur.data > data: if cur.left is None: return False else: cur = cur.left else: if cur.right is None: return False else: cur = cur.right def inorder(self): def helper(node): if node: helper(node.left) print(node.data, end=' ') helper(node.right) helper(self.root) print() def preorder(self): def helper(node): if node: print(node.data, end=' ') helper(node.left) helper(node.right) helper(self.root) print() def postorder(self): def helper(node): if node: helper(node.left) helper(node.right) print(node.data, end=' ') helper(self.root) print() def reverse(self): def helper(node): if node: helper(node.right) helper(node.left) print(node.data, end=' ') helper(self.root) print() def maximum(self): cur = self.root while cur: if cur.right is None: return cur.data else: cur = cur.right def minimum(self): cur = self.root while cur: if cur.left is None: return cur.data else: cur = cur.left bst = BST() values = [50, 30, 80, 10, 40, 90, 60] for value in values: bst.insert(value) print(bst.search(10)) # True print(bst.search(70)) # False bst.inorder() # 10 30 40 50 60 80 90 bst.preorder() # 50 30 10 40 80 60 90 bst.postorder() # 10 40 30 60 90 80 50 bst.reverse() # 90 80 60 50 40 30 10 print(bst.maximum()) # 90 print(bst.minimum()) # 10 --------------------------------------- True False 10 30 40 50 60 80 90 50 30 10 40 80 60 90 10 40 30 60 90 80 50 90 80 60 50 40 30 10 90 10

2. Recursive BST Implementation


class BST: def __init__(self, data): self.data = data self.left = None self.right = None def insert(self, value): if value < self.data: if self.left is None: self.left = BST(value) else: self.left.insert(value) else: if self.right is None: self.right = BST(value) else: self.right.insert(value) def search(self, target): if self.data == target: return "Found" elif target < self.data: if self.left is None: return "Not found" else: return self.left.search(target) else: if self.right is None: return "Not found" else: return self.right.search(target) def inorder(self): if self.left: self.left.inorder() print(self.data, end=' ') if self.right: self.right.inorder() def preorder(self): print(self.data, end=' ') if self.left: self.left.preorder() if self.right: self.right.preorder() def postorder(self): if self.left: self.left.postorder() if self.right: self.right.postorder() print(self.data, end=' ') def minimum(self): if self.left is None: print(self.data) else: self.left.minimum() def maximum(self): if self.right is None: print(self.data) else: self.right.maximum() # main bst = BST(50) values = [30, 80, 10, 40, 90, 60] for value in values: bst.insert(value) print(bst.search(10)) # Found print(bst.search(70)) # Not found bst.inorder() # 10 30 40 50 60 80 90 print() bst.preorder() # 50 30 10 40 80 60 90 print() bst.postorder() # 10 40 30 60 90 80 50 print() bst.minimum() # 10 bst.maximum() # 90 --------------------------------------- Found Not found 10 30 40 50 60 80 90 50 30 10 40 80 60 90 10 40 30 60 90 80 50 10 90

3. Array-Based BST Implementation


class BST: def __init__(self, size): self.size = size self.tree = [None] * size self.root = 0 def insert(self, value, index=0): if index >= self.size: print(f"Cannot insert {value}: Index {index} out of bounds") return if self.tree[index] is None: self.tree[index] = value elif value < self.tree[index]: self.insert(value, 2 * index + 1) else: self.insert(value, 2 * index + 2) def search(self, target, index=0): if index >= self.size or self.tree[index] is None: return "Not found" if self.tree[index] == target: return "Found" elif target < self.tree[index]: return self.search(target, 2 * index + 1) else: return self.search(target, 2 * index + 2) def inorder(self, index=0): if index < self.size and self.tree[index] is not None: self.inorder(2 * index + 1) print(self.tree[index], end=' ') self.inorder(2 * index + 2) def preorder(self, index=0): if index < self.size and self.tree[index] is not None: print(self.tree[index], end=' ') self.preorder(2 * index + 1) self.preorder(2 * index + 2) # main bst = BST(7) values = [50, 30, 70, 20, 40, 60, 90] for value in values: bst.insert(value) print(bst.search(10)) # Not found print(bst.search(70)) # Found bst.inorder() # 20 30 40 50 60 70 90 print() bst.preorder() # 50 30 20 40 70 60 90 print() --------------------------------------- Not found Found 20 30 40 50 60 70 90 50 30 20 40 70 60 90