Find Leftmost Node II - codepath/compsci_guides GitHub Wiki

Unit 8 Session 1 (Click for link to problem statements)

Looking for the recursive version of this problem? Go to Find Leftmost Node I

Problem Highlights

  • 💡 Difficulty: Easy
  • Time to complete: 10 mins
  • 🛠️ Topics: Trees, Binary Trees, Iterative Algorithms

1: U-nderstand

Understand what the interviewer is asking for by using test cases and questions about the problem.

  • Established a set (2-3) of test cases to verify their own solution later.
  • Established a set (1-2) of edge cases to verify their solution handles complexities.
  • Have fully understood the problem and have no clarifying questions.
  • Have you verified any Time/Space Constraints for this problem?
  • Question: What should be returned if the tree is empty?
    • Answer: The function should return None if the tree is empty.
HAPPY CASE
Input: TreeNode(1, TreeNode(2, TreeNode(4)), TreeNode(3))
Output: 4
Explanation: The leftmost node in the tree is the node with value 4, achieved by following the left children.

EDGE CASE
Input: TreeNode(1)
Output: 1
Explanation: The tree has only one node, which is also the leftmost node.

2: M-atch

Match what this problem looks like to known categories of problems, e.g. Linked List or Dynamic Programming, and strategies or patterns in those categories.

This problem involves a straightforward tree traversal to locate the leftmost node, which aligns with iterative depth-first search methods.

3: P-lan

Plan the solution with appropriate visualizations and pseudocode.

General Idea: Iteratively traverse to the leftmost node using a while loop until no left child is available.

1) Start at the root.
2) Use a loop to follow the left child until it no longer exists.
3) Return the value of the node where the loop terminates.

⚠️ Common Mistakes

  • Not handling the case where the tree is empty, leading to attempts to access attributes of None.

4: I-mplement

Implement the code to solve the algorithm.

def left_most(root):
    "
    Return the value of the leftmost node in the binary tree rooted at `root`.
    If the tree is empty, return None.
    "
    if root is None:
        return None
    # Traverse down to the leftmost child
    current = root
    while current.left is not None:
        current = current.left
    return current.val

5: R-eview

Review the code by running specific example(s) and recording values (watchlist) of your code's variables along the way.

  • Verify with different test cases to ensure the function correctly identifies the leftmost node even in unbalanced trees.

6: E-valuate

Evaluate the performance of your algorithm and state any strong/weak or future potential work.

  • Time Complexity: O(n) in the worst case where n is the height of the tree, particularly if it is skewed to one side.
  • Space Complexity: O(1) as no additional space is used apart from the input tree structure.