Bird
Raised Fist0
DSA Goprogramming~20 mins

BST Inorder Successor in DSA Go - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
BST Inorder Successor Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Find the inorder successor in a BST with right subtree
What is the output of the inorder successor function for node 15 in the given BST?
DSA Go
type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

func inorderSuccessor(root, p *TreeNode) *TreeNode {
    if p.Right != nil {
        curr := p.Right
        for curr.Left != nil {
            curr = curr.Left
        }
        return curr
    }
    var succ *TreeNode
    curr := root
    for curr != nil {
        if p.Val < curr.Val {
            succ = curr
            curr = curr.Left
        } else if p.Val > curr.Val {
            curr = curr.Right
        } else {
            break
        }
    }
    return succ
}

// BST structure:
//        20
//       /  \
//     10    30
//       \     \
//       15    40

// Call: inorderSuccessor(root, node with Val=15)
ANode with Val=20
BNode with Val=30
CNode with Val=40
DNode with Val=15
Attempts:
2 left
💡 Hint
Remember, if the node has a right child, the successor is the leftmost node in the right subtree.
❓ Predict Output
intermediate
2:00remaining
Inorder successor when node has no right subtree
What is the output of the inorder successor function for node 10 in the BST below?
DSA Go
type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

func inorderSuccessor(root, p *TreeNode) *TreeNode {
    var succ *TreeNode
    curr := root
    for curr != nil {
        if p.Val < curr.Val {
            succ = curr
            curr = curr.Left
        } else if p.Val > curr.Val {
            curr = curr.Right
        } else {
            break
        }
    }
    return succ
}

// BST structure:
//        20
//       /  \
//     10    30
//    /  
//   5

// Call: inorderSuccessor(root, node with Val=10)
ANode with Val=30
BNode with Val=5
CNode with Val=20
DNode with Val=10
Attempts:
2 left
💡 Hint
If the node has no right child, the successor is the lowest ancestor whose left child is also an ancestor of the node.
🔧 Debug
advanced
2:00remaining
Identify the error in inorder successor code
What error will this code produce when finding the inorder successor of node 25 in the BST below?
DSA Go
type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

func inorderSuccessor(root, p *TreeNode) *TreeNode {
    if p.Right != nil {
        curr := p.Right
        for curr.Right != nil {
            curr = curr.Right
        }
        return curr
    }
    var succ *TreeNode
    curr := root
    for curr != nil {
        if p.Val < curr.Val {
            succ = curr
            curr = curr.Left
        } else if p.Val > curr.Val {
            curr = curr.Right
        } else {
            break
        }
    }
    return succ
}

// BST structure:
//        20
//       /  \
//     10    30
//           / \
//         25   40

// Call: inorderSuccessor(root, node with Val=25)
AReturns nil
BReturns node with Val=30
CReturns node with Val=25
DReturns node with Val=40
Attempts:
2 left
💡 Hint
Check the traversal inside the right subtree for the successor.
🧠 Conceptual
advanced
1:00remaining
Inorder successor when node is the maximum element
What is the inorder successor of the maximum node in a BST?
AThe minimum node in the BST
BThe root node
CThe parent of the maximum node
DNil (no successor)
Attempts:
2 left
💡 Hint
Think about the inorder traversal order and what comes after the largest value.
🚀 Application
expert
3:00remaining
Find inorder successor in BST without parent pointer
Given a BST and a node p without parent pointers, which approach correctly finds the inorder successor of p?
ATraverse from root, keep track of potential successor when moving left, return last recorded successor
BTraverse from p to root using parent pointers to find successor
CReturn the right child of p if exists, else return p itself
DTraverse the entire tree inorder and return the node after p
Attempts:
2 left
💡 Hint
Without parent pointers, you must start from the root to find the successor.

Practice

(1/5)
1. What is the inorder successor of a node in a Binary Search Tree (BST)?
easy
A. The node with the largest key smaller than the given node's key
B. The node with the smallest key greater than the given node's key
C. The root node of the BST
D. The left child of the given node

Solution

  1. Step 1: Understand inorder traversal order

    Inorder traversal visits nodes in ascending order of their keys in a BST.
  2. Step 2: Define inorder successor

    The inorder successor of a node is the next node visited after it in inorder traversal, which is the smallest node with a key greater than the current node's key.
  3. Final Answer:

    The node with the smallest key greater than the given node's key -> Option B
  4. Quick Check:

    Inorder successor = next larger node [OK]
Hint: Inorder successor is next bigger node in BST [OK]
Common Mistakes:
  • Confusing successor with predecessor
  • Thinking successor is always right child
  • Assuming successor is parent node
2. Which of the following Go function signatures correctly represents a function to find the inorder successor of a BST node?
easy
A. func inorderSuccessor(root *Node, p *Node) *Node
B. func inorderSuccessor(p *Node) *Node
C. func inorderSuccessor(root Node, p Node) Node
D. func inorderSuccessor(root *Node) int

Solution

  1. Step 1: Analyze function parameters

    To find the inorder successor, we need the BST root and the target node pointer, both as pointers to Node structs.
  2. Step 2: Check return type

    The function should return a pointer to the successor node, so return type is *Node.
  3. Final Answer:

    func inorderSuccessor(root *Node, p *Node) *Node -> Option A
  4. Quick Check:

    Function needs root and target node pointers, returns node pointer [OK]
Hint: Function needs root and target node pointers [OK]
Common Mistakes:
  • Passing nodes by value instead of pointer
  • Returning int instead of node pointer
  • Missing root parameter
3. Given the following BST and code snippet, what will be printed?
type Node struct {
    Val   int
    Left  *Node
    Right *Node
}

func inorderSuccessor(root, p *Node) *Node {
    var successor *Node
    for root != nil {
        if p.Val < root.Val {
            successor = root
            root = root.Left
        } else {
            root = root.Right
        }
    }
    return successor
}

// BST structure:
//       20
//      /  \
//    10    30
//      \
//      15

p := &Node{Val: 15}
succ := inorderSuccessor(root, p)
if succ != nil {
    fmt.Println(succ.Val)
} else {
    fmt.Println("nil")
}
medium
A. 20
B. 30
C. 15
D. nil

Solution

  1. Step 1: Trace inorderSuccessor function for p=15

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

    Successor is 20, so succ.Val = 20 is printed.
  3. Final Answer:

    20 -> Option A
  4. Quick Check:

    Next bigger node after 15 is 20 [OK]
Hint: Successor is smallest node bigger than p [OK]
Common Mistakes:
  • Returning p itself as successor
  • Returning nil when right subtree is empty
  • Confusing successor with predecessor
4. The following Go code tries to find the inorder successor of a node in a BST but has a bug. What is the bug?
func inorderSuccessor(root, p *Node) *Node {
    if p.Right != nil {
        curr := p.Right
        for curr.Left != nil {
            curr = curr.Left
        }
        return curr
    }
    var successor *Node
    for root != nil {
        if p.Val < root.Val {
            successor = root
            root = root.Left
        } else {
            root = root.Right
        }
    }
    return successor
}
medium
A. It does not handle the case when p has no right child
B. It incorrectly returns p.Right when p.Right is nil
C. It does not update successor when p.Val equals root.Val
D. It assumes root is always the BST root, which may not be true

Solution

  1. Step 1: Understand the logic for successor search

    The code tries to find successor by checking right subtree or walking from root to find successor.
  2. Step 2: Identify the bug in root traversal

    The code assumes root is the BST root, but if root is not the actual BST root or p is not reachable from root, the successor found may be incorrect.
  3. Final Answer:

    It assumes root is always the BST root, which may not be true -> Option D
  4. Quick Check:

    Root must be BST root to find correct successor [OK]
Hint: Ensure root is BST root, not arbitrary node [OK]
Common Mistakes:
  • Passing a root that is not the BST root
  • Not checking if p.Right is nil before access
  • Ignoring case when p has no right subtree
5. You have a BST where each node has a parent pointer in addition to left and right children. How can you find the inorder successor of a node p efficiently using this parent pointer? Choose the correct approach.
hard
A. Always move to the root and perform full inorder traversal to find successor
B. If p has left child, successor is rightmost node in left subtree; else move down to left child
C. If p has right child, successor is leftmost node in right subtree; else move up using parent until node is left child of its parent
D. Successor is always the parent node regardless of children

Solution

  1. Step 1: Check if p has right child

    If yes, successor is the leftmost node in p's right subtree.
  2. Step 2: If no right child, move up using parent pointer

    Keep moving up until current node is left child of its parent; that parent is the successor.
  3. Final Answer:

    If p has right child, successor is leftmost node in right subtree; else move up using parent until node is left child of its parent -> Option C
  4. Quick Check:

    Use right subtree or climb parents to find successor [OK]
Hint: Use right subtree or climb parents via left child check [OK]
Common Mistakes:
  • Confusing left and right subtree roles
  • Always returning parent as successor
  • Performing full traversal instead of using parent pointer
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