0
0
DSA C++programming

BST vs Hash Map Trade-offs for Ordered Data in DSA C++ - Trade-offs & Analysis

Choose your learning style9 modes available
Mental Model
A BST keeps data sorted and lets you find items in order, while a hash map finds items fast but doesn't keep order.
Analogy: Think of a phone book (BST) where names are in order so you can flip through alphabetically, versus a big box of cards (hash map) where you find a card quickly by looking up a label but the cards are all mixed up.
BST:
    5
   / \
  3   7
 /     \
2       9

Hash Map:
[0]: null
[1]: (7, val)
[2]: (2, val)
[3]: null
[4]: (5, val)
[5]: null
Dry Run Walkthrough
Input: Insert keys 5, 3, 7, 2, 9 and then search for key 7
Goal: Show how BST keeps keys sorted and hash map finds key fast but unordered
Step 1: Insert 5 into empty BST and hash map
BST: 5 -> null
Hash Map: [hash(5)]: (5, val)
Why: Start with first key in both structures
Step 2: Insert 3 into BST left of 5; insert in hash map at hash(3)
BST: 5 -> left -> 3 -> null
Hash Map: [hash(3)]: (3, val), [hash(5)]: (5, val)
Why: BST keeps order by placing smaller key left; hash map stores by hash
Step 3: Insert 7 into BST right of 5; insert in hash map at hash(7)
BST: 5 -> left -> 3, right -> 7 -> null
Hash Map: [hash(3)]: (3, val), [hash(5)]: (5, val), [hash(7)]: (7, val)
Why: BST places larger key right; hash map adds new entry
Step 4: Insert 2 into BST left of 3; insert in hash map at hash(2)
BST: 5 -> left -> 3 -> left -> 2, right -> 7
Hash Map: [hash(2)]: (2, val), [hash(3)]: (3, val), [hash(5)]: (5, val), [hash(7)]: (7, val)
Why: BST keeps smaller keys further left; hash map stores by hash
Step 5: Insert 9 into BST right of 7; insert in hash map at hash(9)
BST: 5 -> left -> 3 -> left -> 2, right -> 7 -> right -> 9
Hash Map: [hash(2)]: (2, val), [hash(3)]: (3, val), [hash(5)]: (5, val), [hash(7)]: (7, val), [hash(9)]: (9, val)
Why: BST keeps larger keys further right; hash map stores by hash
Step 6: Search for key 7 in BST by comparing and moving right
BST traversal: 5 -> 7 found
Hash Map lookup: direct at [hash(7)]
Why: BST search follows order; hash map finds directly by hash
Result:
BST final: 5 -> 3 -> 2 -> null (left side), 5 -> 7 -> 9 -> null (right side)
Hash Map final: unordered keys at hash indices
Search result: key 7 found quickly in both
Annotated Code
DSA C++
#include <iostream>
#include <unordered_map>
using namespace std;

struct Node {
    int key;
    Node* left;
    Node* right;
    Node(int k) : key(k), left(nullptr), right(nullptr) {}
};

class BST {
public:
    Node* root;
    BST() : root(nullptr) {}

    void insert(int key) {
        root = insertRec(root, key);
    }

    Node* insertRec(Node* node, int key) {
        if (!node) return new Node(key); // create new node if null
        if (key < node->key) node->left = insertRec(node->left, key); // go left if smaller
        else if (key > node->key) node->right = insertRec(node->right, key); // go right if larger
        return node; // return unchanged node pointer
    }

    bool search(int key) {
        Node* curr = root;
        while (curr) {
            if (key == curr->key) return true; // found key
            else if (key < curr->key) curr = curr->left; // go left
            else curr = curr->right; // go right
        }
        return false; // not found
    }

    void inorderPrint(Node* node) {
        if (!node) return;
        inorderPrint(node->left);
        cout << node->key << " ";
        inorderPrint(node->right);
    }
};

int main() {
    BST bst;
    unordered_map<int, string> hashmap;

    int keys[] = {5, 3, 7, 2, 9};
    for (int k : keys) {
        bst.insert(k); // insert in BST
        hashmap[k] = "val"; // insert in hash map
    }

    cout << "BST inorder: ";
    bst.inorderPrint(bst.root);
    cout << "\n";

    int searchKey = 7;
    cout << "BST search for " << searchKey << ": " << (bst.search(searchKey) ? "found" : "not found") << "\n";

    cout << "Hash map search for " << searchKey << ": ";
    if (hashmap.find(searchKey) != hashmap.end()) cout << "found";
    else cout << "not found";
    cout << "\n";

    return 0;
}
if (!node) return new Node(key);
create new node when reaching null position in BST
if (key < node->key) node->left = insertRec(node->left, key);
go left if key smaller to keep BST order
else if (key > node->key) node->right = insertRec(node->right, key);
go right if key larger to keep BST order
while (curr) { if (key == curr->key) return true; else if (key < curr->key) curr = curr->left; else curr = curr->right; }
search BST by comparing and moving left or right
hashmap[k] = "val";
insert key-value pair in hash map for O(1) access
if (hashmap.find(searchKey) != hashmap.end()) cout << "found";
directly check presence in hash map
OutputSuccess
BST inorder: 2 3 5 7 9 BST search for 7: found Hash map search for 7: found
Complexity Analysis
Time: O(log n) average for BST operations because it traverses height; O(1) average for hash map lookup due to direct indexing
Space: O(n) for both BST and hash map because they store all keys
vs Alternative: BST keeps keys sorted for ordered traversal but slower search; hash map is faster for search but unordered
Edge Cases
Empty BST and hash map
Search returns not found; insert creates first node or entry
DSA C++
if (!node) return new Node(key);
Duplicate keys insertion
BST ignores duplicates by not inserting again; hash map overwrites value
DSA C++
else if (key > node->key) node->right = insertRec(node->right, key);
Searching for non-existent key
BST search returns false after reaching null; hash map returns not found
DSA C++
while (curr) { ... } return false;
When to Use This Pattern
When a problem needs both fast search and ordered data access, consider BST for order and hash map for speed; trade-offs depend on whether order or speed is priority.
Common Mistakes
Mistake: Assuming hash map keeps keys in order
Fix: Remember hash maps do not maintain order; use BST or balanced tree for ordered data
Mistake: Not handling duplicates in BST insert causing infinite recursion
Fix: Add condition to ignore or handle duplicates explicitly
Summary
BST stores keys in sorted order allowing ordered traversal and search in O(log n) average time.
Use BST when you need to keep data sorted and perform range queries or ordered operations.
The key insight is BST maintains order by placing smaller keys left and larger keys right, unlike hash maps which are unordered but faster for direct lookup.