0
0
DSA Javascriptprogramming~10 mins

BST Iterator Design in DSA Javascript - Execution Trace

Choose your learning style9 modes available
Concept Flow - BST Iterator Design
Initialize stack empty
Push left nodes from root
Check stack empty?
YesEnd iteration
No
Pop top node
Return node value
Push left nodes of popped node's right child
Repeat from Check stack empty?
The iterator uses a stack to store left nodes. It pops the top node to return its value, then pushes left nodes of the popped node's right child, repeating until stack is empty.
Execution Sample
DSA Javascript
class BSTIterator {
  constructor(root) {
    this.stack = [];
    this._pushLeft(root);
  }
  _pushLeft(node) {
    while (node) {
      this.stack.push(node);
      node = node.left;
    }
  }
  next() {
    const node = this.stack.pop();
    this._pushLeft(node.right);
    return node.val;
  }
  hasNext() {
    return this.stack.length > 0;
  }
}
This code creates an iterator for BST that returns nodes in ascending order using a stack to track left nodes.
Execution Table
StepOperationNodes in Stack (top->bottom)Pointer ChangesVisual State
1Initialize iterator with root=7[7, 3, 1]Push 7, then 3, then 1Stack: Top->1->3->7
2hasNext()[7, 3, 1]No changeStack unchanged
3next()[7, 3]Pop 1; push left nodes of 1.right (null)Return 1; Stack: Top->3->7
4hasNext()[7, 3]No changeStack unchanged
5next()[7, 4]Pop 3; push left nodes of 3.right (4)Return 3; Stack: Top->4->7
6hasNext()[7, 4]No changeStack unchanged
7next()[7]Pop 4; push left nodes of 4.right (null)Return 4; Stack: Top->7
8hasNext()[7]No changeStack unchanged
9next()[9, 8]Pop 7; push left nodes of 7.right (9, 8)Return 7; Stack: Top->8->9
10hasNext()[9, 8]No changeStack unchanged
11next()[9]Pop 8; push left nodes of 8.right (null)Return 8; Stack: Top->9
12hasNext()[9]No changeStack unchanged
13next()[]Pop 9; push left nodes of 9.right (null)Return 9; Stack empty
14hasNext()[]No changeStack empty; iteration ends
💡 Stack becomes empty after popping last node 9, so hasNext() returns false and iteration ends.
Variable Tracker
VariableStartAfter Step 1After Step 3After Step 5After Step 7After Step 9After Step 11After Step 13Final
stack[][7,3,1][7,3][7,4][7][9,8][9][][]
current node (in next())nullnull134789null
returned valuenullnull134789null
Key Moments - 3 Insights
Why do we push all left nodes from the root initially?
Because the smallest values are on the leftmost path, pushing them first ensures next() returns nodes in ascending order (see execution_table step 1).
What happens when we pop a node with a right child?
We push all left nodes of that right child to the stack to continue in-order traversal (see execution_table step 9 where after popping 7, nodes 9 and 8 are pushed).
Why does hasNext() check if the stack is empty?
Because the stack holds nodes yet to be visited; empty stack means traversal is complete (see execution_table step 14).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 5, what is the top node in the stack after next()?
ANode with value 7
BNode with value 3
CNode with value 4
DNode with value 1
💡 Hint
Check the 'Nodes in Stack' column at step 5 in execution_table
At which step does the stack become empty, ending the iteration?
AStep 14
BStep 9
CStep 13
DStep 1
💡 Hint
Look at the 'Nodes in Stack' column and 'exit_note' in execution_table
If the BST had no right children, how would the stack change after each next() call?
AStack would grow after each next() call
BStack would only shrink by popping nodes, no new nodes pushed
CStack would remain the same size
DStack would be empty from the start
💡 Hint
Refer to how _pushLeft(node.right) works in execution_table steps where right child is null
Concept Snapshot
BST Iterator uses a stack to traverse nodes in ascending order.
Initialize by pushing all left nodes from root.
next() pops top node, returns its value, then pushes left nodes of popped node's right child.
hasNext() checks if stack is empty.
This simulates in-order traversal without recursion.
Full Transcript
The BST Iterator design uses a stack to simulate in-order traversal of a binary search tree. Initially, it pushes all left nodes from the root to the stack, so the smallest node is on top. When next() is called, it pops the top node from the stack, returns its value, and then pushes all left nodes of the popped node's right child to the stack. This process continues until the stack is empty, which means all nodes have been visited in ascending order. The hasNext() method simply checks if the stack has any nodes left to visit. This design avoids recursion and allows controlled iteration over the BST.