Skillversitas

Binary Search Tree

A Binary Search Tree (BST) is a binary tree in which every node satisfies the following property: all values in the left subtree are smaller, and all values in the right subtree are larger, than the current node's value.

BST Property

       8
      / \
     3   10
    / \    \
   1   6    14
  • Left of 8: all values < 8
  • Right of 8: all values > 8
  • This applies recursively to every subtree

Implementation

class BSTNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

class BST:
    def __init__(self):
        self.root = None

    def insert(self, val):
        self.root = self._insert(self.root, val)

    def _insert(self, node, val):
        if not node:
            return BSTNode(val)
        if val < node.val:
            node.left = self._insert(node.left, val)
        elif val > node.val:
            node.right = self._insert(node.right, val)
        return node

    def search(self, val):
        return self._search(self.root, val)

    def _search(self, node, val):
        if not node:
            return False
        if val == node.val:
            return True
        elif val < node.val:
            return self._search(node.left, val)
        else:
            return self._search(node.right, val)

Delete

    def delete(self, val):
        self.root = self._delete(self.root, val)

    def _delete(self, node, val):
        if not node:
            return None
        if val < node.val:
            node.left = self._delete(node.left, val)
        elif val > node.val:
            node.right = self._delete(node.right, val)
        else:
            if not node.left:
                return node.right
            if not node.right:
                return node.left
            successor = self._min_node(node.right)
            node.val = successor.val
            node.right = self._delete(node.right, successor.val)
        return node

    def _min_node(self, node):
        while node.left:
            node = node.left
        return node

    def inorder(self):
        result = []
        self._inorder(self.root, result)
        return result

    def _inorder(self, node, result):
        if node:
            self._inorder(node.left, result)
            result.append(node.val)
            self._inorder(node.right, result)

Time Complexity

Operation Average Worst (skewed)
Insert O(log n) O(n)
Search O(log n) O(n)
Delete O(log n) O(n)

The Problem with a Plain BST

A BST can become skewed (like a linked list) if data arrives in sorted order:

# Sorted input: 1, 2, 3, 4, 5
# The BST becomes:
# 1
#  \
#   2
#    \
#     3
#      \
#       4
#        \
#         5
# Height = 5, search O(n)

A plain BST can lose its efficiency. The solution: a balanced tree such as the AVL Tree.