Bird
Raised Fist0
DSA Goprogramming~5 mins

BST Inorder Predecessor in DSA Go - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the inorder predecessor in a Binary Search Tree (BST)?
The inorder predecessor of a node in a BST is the node that comes immediately before it in the inorder traversal. It is the largest node smaller than the given node.
Click to reveal answer
beginner
How do you find the inorder predecessor if the node has a left subtree?
If the node has a left subtree, the inorder predecessor is the rightmost (maximum) node in that left subtree.
Click to reveal answer
intermediate
What if the node does not have a left subtree? How to find its inorder predecessor?
If the node has no left subtree, move up the tree using parent pointers until you find a node which is the right child of its parent. That parent is the inorder predecessor.
Click to reveal answer
intermediate
Why is the inorder predecessor important in BST operations?
It helps in operations like deletion of a node by replacing the node with its inorder predecessor to maintain BST properties.
Click to reveal answer
beginner
In Go, what is a simple approach to find the inorder predecessor of a node in a BST?
Traverse to the left child, then keep moving to the right child until no more right child exists. That node is the inorder predecessor.
Click to reveal answer
What is the inorder predecessor of the smallest node in a BST?
AIts left child
BIt has no inorder predecessor
CIts right child
DIts parent
If a node has a left subtree, where do you look for its inorder predecessor?
ARoot node
BLeftmost node in the right subtree
CRightmost node in the left subtree
DParent node
If a node has no left subtree, how do you find its inorder predecessor?
AGo up to the parent until the node is a right child
BGo down to the left child
CGo to the right child
DIt has no inorder predecessor
Why is the inorder predecessor useful when deleting a node in BST?
AIt is always the root node
BIt is the rightmost node in the right subtree
CIt is the smallest node in the tree
DIt replaces the deleted node to keep BST order
In Go, which loop helps find the inorder predecessor in the left subtree?
ALoop moving right until no right child
BLoop moving left until no left child
CLoop moving up to parent
DLoop moving down to root
Explain how to find the inorder predecessor of a node in a BST with and without a left subtree.
Think about the inorder traversal order and how nodes relate.
You got /3 concepts.
    Describe why the inorder predecessor is important in BST node deletion.
    Consider what happens when you remove a node with two children.
    You got /3 concepts.

      Practice

      (1/5)
      1. What is the inorder predecessor of a node in a Binary Search Tree (BST)?
      easy
      A. The node with the smallest value larger than the given node
      B. The node with the largest value smaller than the given node
      C. The left child of the given node
      D. The right child of the given node

      Solution

      1. Step 1: Understand inorder traversal in BST

        Inorder traversal visits nodes in ascending order of their values.
      2. Step 2: Define inorder predecessor

        The inorder predecessor of a node is the node that comes just before it in this ascending order, meaning it has the largest value smaller than the node.
      3. Final Answer:

        The node with the largest value smaller than the given node -> Option B
      4. Quick Check:

        Inorder predecessor = largest smaller value [OK]
      Hint: Predecessor is largest smaller value in BST [OK]
      Common Mistakes:
      • Confusing predecessor with successor
      • Thinking predecessor is always left child
      • Assuming predecessor is the parent node
      2. Which of the following Go function signatures correctly represents a function to find the inorder predecessor in a BST node struct named Node?
      easy
      A. func inorderPredecessor(root *Node, key int) *Node
      B. func inorderPredecessor(key int) Node
      C. func inorderPredecessor(root Node, key int) Node
      D. func inorderPredecessor(root *Node) int

      Solution

      1. Step 1: Analyze function parameters and return type

        The function needs the BST root pointer and the key to find predecessor for, and returns a pointer to the predecessor node.
      2. Step 2: Match with options

        func inorderPredecessor(root *Node, key int) *Node matches this: it takes *Node root, int key, and returns *Node.
      3. Final Answer:

        func inorderPredecessor(root *Node, key int) *Node -> Option A
      4. Quick Check:

        Pointer root and key input, pointer node output [OK]
      Hint: Use pointer receiver and return pointer for BST nodes [OK]
      Common Mistakes:
      • Passing root by value instead of pointer
      • Returning node value instead of node pointer
      • Missing key parameter to identify target node
      3. Given the following BST and code snippet, what will be printed?
      type Node struct {
          Val int
          Left, Right *Node
      }
      
      func inorderPredecessor(root *Node, key int) *Node {
          var predecessor *Node
          curr := root
          for curr != nil {
              if key <= curr.Val {
                  curr = curr.Left
              } else {
                  predecessor = curr
                  curr = curr.Right
              }
          }
          return predecessor
      }
      
      func main() {
          root := &Node{Val: 20}
          root.Left = &Node{Val: 10}
          root.Right = &Node{Val: 30}
          root.Left.Left = &Node{Val: 5}
          root.Left.Right = &Node{Val: 15}
      
          pred := inorderPredecessor(root, 15)
          if pred != nil {
              fmt.Println(pred.Val)
          } else {
              fmt.Println("No predecessor")
          }
      }
      medium
      A. No predecessor
      B. 5
      C. 15
      D. 10

      Solution

      1. Step 1: Trace the inorderPredecessor function for key=15

        Start at root (20). Since 15 <= 20, move left to 10. Since 15 > 10, set predecessor=10, move right to 15. Since 15 <= 15, move left (nil). Loop ends.
      2. Step 2: Return predecessor node value

        Predecessor is node with value 10, so print 10.
      3. Final Answer:

        10 -> Option D
      4. Quick Check:

        Largest smaller than 15 is 10 [OK]
      Hint: Move left if key ≤ node, else update predecessor and move right [OK]
      Common Mistakes:
      • Returning the key itself as predecessor
      • Confusing predecessor with successor
      • Not updating predecessor correctly when moving right
      4. The following Go function is intended to find the inorder predecessor of a node with value key in a BST. What is the bug?
      func inorderPredecessor(root *Node, key int) *Node {
          var predecessor *Node
          curr := root
          for curr != nil {
              if key < curr.Val {
                  curr = curr.Left
              } else {
                  predecessor = curr
                  curr = curr.Right
              }
          }
          return predecessor
      }
      medium
      A. The function should return curr instead of predecessor
      B. The predecessor variable should be reset inside the loop
      C. The condition should be key <= curr.Val to handle equal keys correctly
      D. The loop should use recursion instead of iteration

      Solution

      1. Step 1: Analyze the condition in the loop

        The current condition is key < curr.Val, which skips updating predecessor when key equals curr.Val.
      2. Step 2: Correct the condition to include equality

        Changing to key <= curr.Val ensures that when key equals curr.Val, we move left without updating predecessor, which is correct for inorder predecessor logic.
      3. Final Answer:

        The condition should be key <= curr.Val to handle equal keys correctly -> Option C
      4. Quick Check:

        Use <= to handle equal keys properly [OK]
      Hint: Use <= in condition to handle equal keys correctly [OK]
      Common Mistakes:
      • Using < instead of <= causes wrong predecessor for equal keys
      • Resetting predecessor inside loop loses previous valid value
      • Returning curr instead of predecessor returns wrong node
      5. You have a BST where each node has a pointer to its parent. How would you find the inorder predecessor of a given node n efficiently without starting from the root? Choose the best approach.
      hard
      A. If n has a left child, find the rightmost node in its left subtree; else, move up using parent pointers until you find a node which is the right child of its parent
      B. Always start from the root and do a full inorder traversal to find predecessor
      C. If n has a right child, find the leftmost node in its right subtree; else, move up using parent pointers until you find a node which is the left child of its parent
      D. Return the parent node directly as the predecessor

      Solution

      1. Step 1: Check if node has left subtree

        If n has a left child, the predecessor is the rightmost node in that left subtree.
      2. Step 2: If no left child, move up using parent pointers

        Move up until you find a node that is the right child of its parent; that parent is the predecessor.
      3. Final Answer:

        If n has left child, find rightmost in left subtree; else move up until node is right child -> Option A
      4. Quick Check:

        Use left subtree or climb parents to find predecessor [OK]
      Hint: Use left subtree or climb parents via right child link [OK]
      Common Mistakes:
      • Starting from root wastes time
      • Confusing predecessor with successor logic
      • Returning parent directly without checks
      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