Bird
Raised Fist0
DSA Cprogramming~5 mins

BST Iterator Design in DSA C - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the main purpose of a BST Iterator?
A BST Iterator allows you to traverse a Binary Search Tree (BST) in sorted order (in-order traversal) efficiently, providing next smallest elements one by one without traversing the whole tree at once.
Click to reveal answer
intermediate
How does a BST Iterator typically store its state internally?
It uses a stack to keep track of nodes. The stack stores the path from the root to the current node, allowing the iterator to move to the next smallest node by popping and pushing nodes as needed.
Click to reveal answer
intermediate
What is the time complexity of the next() operation in a BST Iterator?
The average time complexity of next() is O(1) amortized, because each node is pushed and popped from the stack exactly once during the entire traversal.
Click to reveal answer
intermediate
Why does the BST Iterator use a stack instead of recursion for in-order traversal?
Using a stack allows the iterator to pause and resume traversal efficiently, giving one element at a time on demand, unlike recursion which processes the whole traversal at once.
Click to reveal answer
beginner
What does the hasNext() method do in a BST Iterator?
hasNext() checks if there are more nodes to visit in the BST by verifying if the stack is not empty, indicating that the next smallest element is available.
Click to reveal answer
What data structure is primarily used inside a BST Iterator to track nodes?
AStack
BQueue
CLinked List
DArray
What traversal order does a BST Iterator follow to return elements?
APre-order
BPost-order
CIn-order
DLevel-order
What does the next() method in a BST Iterator return?
ANext smallest element
BNext largest element
CRoot node
DRandom node
What does hasNext() return if the BST Iterator has no more elements?
Atrue
Bfalse
Cnull
DThrows error
What is the average time complexity of the next() operation in a BST Iterator?
AO(n)
BO(log n)
CO(n log n)
DO(1) amortized
Explain how a BST Iterator uses a stack to return the next smallest element.
Think about how in-order traversal visits nodes left-root-right.
You got /4 concepts.
    Describe the difference between using recursion and a stack in implementing a BST Iterator.
    Consider how an iterator returns one element at a time.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of a BST Iterator in a binary search tree?
      easy
      A. To delete nodes from the BST
      B. To insert new nodes into the BST
      C. To balance the BST automatically
      D. To traverse the BST in ascending order without recursion

      Solution

      1. Step 1: Understand BST Iterator functionality

        A BST Iterator is designed to traverse the tree in sorted order, typically ascending, without using recursion.
      2. Step 2: Identify the main purpose

        It provides a way to get the next smallest element efficiently, which matches To traverse the BST in ascending order without recursion.
      3. Final Answer:

        To traverse the BST in ascending order without recursion -> Option D
      4. Quick Check:

        BST Iterator = In-order traversal without recursion [OK]
      Hint: BST Iterator returns next smallest element in sorted order [OK]
      Common Mistakes:
      • Confusing iterator with insertion or deletion
      • Thinking it balances the tree automatically
      • Assuming it uses recursion internally
      2. Which of the following is the correct way to declare a stack for implementing a BST Iterator in C?
      easy
      A. int stack[100]; int top = -1;
      B. stack<int> s; // C++ syntax
      C. List<int> stack = new List<int>();
      D. var stack = [];

      Solution

      1. Step 1: Identify language and syntax

        The question is about C language, so C++ or other language syntax is invalid.
      2. Step 2: Choose correct C stack declaration

        int stack[100]; int top = -1; declares a fixed-size integer array and a top index, which is the typical way to implement a stack in C.
      3. Final Answer:

        int stack[100]; int top = -1; -> Option A
      4. Quick Check:

        C stack = array + top index [OK]
      Hint: Use array and top index for stack in C [OK]
      Common Mistakes:
      • Using C++ or other language syntax in C
      • Using dynamic lists not available in C
      • Using var keyword which is not in C
      3. Consider the following BST Iterator code snippet in C. What will be the output sequence of next() calls?
      typedef struct Node {
        int val;
        struct Node* left;
        struct Node* right;
      } Node;
      
      // Assume stack and top are global
      void push(Node* node) { stack[++top] = node; }
      Node* pop() { return stack[top--]; }
      
      void pushLeft(Node* root) {
        while (root) {
          push(root);
          root = root->left;
        }
      }
      
      Node* next() {
        Node* node = pop();
        pushLeft(node->right);
        return node;
      }
      
      // BST structure:
      //       5
      //      / \
      //     3   7
      //    / \   \
      //   2   4   8
      
      // Initial call: pushLeft(root) where root = 5
      
      // Calls: next(), next(), next(), next(), next(), next()
      medium
      A. [2, 4, 3, 5, 8, 7]
      B. [5, 3, 2, 4, 7, 8]
      C. [2, 3, 4, 5, 7, 8]
      D. [8, 7, 5, 4, 3, 2]

      Solution

      1. Step 1: Understand pushLeft and next behavior

        pushLeft pushes all left children starting from root. next pops top node, then pushes left children of right subtree.
      2. Step 2: Trace calls step-by-step

        Initial stack after pushLeft(5): [5,3,2] (top is 2). next() pops 2 (no right child), output 2.
        next() pops 3, pushes left of 4 (which is 4), output 3.
        next() pops 4 (no right child), output 4.
        next() pops 5, pushes left of 7 (which is 7), output 5.
        next() pops 7, pushes left of 8 (which is 8), output 7.
        next() pops 8, output 8.
      3. Final Answer:

        [2, 3, 4, 5, 7, 8] -> Option C
      4. Quick Check:

        In-order traversal = [2,3,4,5,7,8] [OK]
      Hint: Trace stack push/pop for in-order sequence [OK]
      Common Mistakes:
      • Ignoring pushLeft on right child
      • Assuming preorder or postorder output
      • Mixing up stack order
      4. The following code snippet for BST Iterator has a bug. What is the error?
      typedef struct Node {
        int val;
        struct Node* left;
        struct Node* right;
      } Node;
      
      Node* stack[100];
      int top = -1;
      
      void push(Node* node) { stack[++top] = node; }
      Node* pop() { return stack[top--]; }
      
      void pushLeft(Node* root) {
        while (root != NULL) {
          push(root);
          root = root->left;
        }
      }
      
      Node* next() {
        Node* node = pop();
        pushLeft(node->right);
        return node;
      }
      
      int hasNext() {
        return top >= 0;
      }
      
      // Usage:
      // pushLeft(root);
      // while (hasNext()) {
      //   Node* n = next();
      //   printf("%d ", n->val);
      // }
      
      medium
      A. pop() returns NULL when stack is empty causing crash
      B. Stack overflow if BST is large and pushLeft pushes too many nodes
      C. pushLeft does not handle NULL root correctly
      D. hasNext() returns wrong boolean value

      Solution

      1. Step 1: Analyze stack usage in pushLeft

        pushLeft pushes all left nodes onto stack. For a very deep BST, this can exceed stack size 100 causing overflow.
      2. Step 2: Check other functions for errors

        pop() assumes stack not empty; hasNext() correctly checks top >= 0; pushLeft handles NULL root by stopping loop.
      3. Final Answer:

        Stack overflow if BST is large and pushLeft pushes too many nodes -> Option B
      4. Quick Check:

        Fixed stack size risks overflow [OK]
      Hint: Check fixed stack size limits for large BSTs [OK]
      Common Mistakes:
      • Assuming pop() returns NULL safely
      • Thinking pushLeft fails on NULL root
      • Believing hasNext() logic is incorrect
      5. You want to design a BST Iterator that supports next() and hasNext() in O(1) average time and uses O(h) memory, where h is tree height. Which approach best achieves this?
      hard
      A. Use a stack to store left children, pushing right subtree nodes on next() calls
      B. Store all nodes in an array by in-order traversal at initialization
      C. Use recursion to traverse nodes on each next() call
      D. Use a queue to store nodes level by level

      Solution

      1. Step 1: Understand time and space constraints

        O(1) average time per next() and O(h) memory means no full traversal storage and no recursion per call.
      2. Step 2: Evaluate options

        Use a stack to store left children, pushing right subtree nodes on next() calls uses a stack to store left children only, pushing right subtree nodes lazily, matching constraints.
        Store all nodes in an array by in-order traversal at initialization uses O(n) memory, violating O(h).
        Use recursion to traverse nodes on each next() call uses recursion each call, not O(1) average.
        Use a queue to store nodes level by level uses queue level order, not in-order traversal.
      3. Final Answer:

        Use a stack to store left children, pushing right subtree nodes on next() calls -> Option A
      4. Quick Check:

        Stack + lazy push = O(1) avg time & O(h) space [OK]
      Hint: Stack with lazy right pushes fits O(1) avg time and O(h) space [OK]
      Common Mistakes:
      • Precomputing all nodes wastes memory
      • Using recursion each next() call is slow
      • Using queue gives wrong traversal order
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard