Find Leftmost Path I - codepath/compsci_guides GitHub Wiki
Unit 8 Session 1 (Click for link to problem statements)
Looking for the iterative version of this problem? Go to Find Leftmost Path II
Problem Highlights
- 💡 Difficulty: Easy
- ⏰ Time to complete: 10 mins
- 🛠️ Topics: Trees, Binary Trees, Recursive 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 the function return if the tree is empty?
- Answer: The function should return an empty list as there is no path to follow.
HAPPY CASE
Input: TreeNode('a', TreeNode('b', TreeNode('d'), None), None)
Output: ['a', 'b', 'd']
Explanation: The leftmost path from the root 'a' leads to 'b' and continues to 'd'.
EDGE CASE
Input: TreeNode('a')
Output: ['a']
Explanation: The tree has only one node, so the leftmost path includes just the root 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 fits into tree traversal categories, specifically finding a path in a tree. It involves a recursive depth-first search tailored to always take the leftmost branch until reaching a leaf.
3: P-lan
Plan the solution with appropriate visualizations and pseudocode.
General Idea: Recursively navigate down the leftmost side of the tree, collecting nodes until a leaf is reached.
1) Check if the current node is None. If true, return an empty list.
2) Append the current node’s value to the path list.
3) Recursively call the function for the left child of the current node and add the result to the path list.
4) Return the path list.
⚠️ Common Mistakes
- Forgetting to handle the case where a node has no left child, which should terminate the recursion.
4: I-mplement
Implement the code to solve the algorithm.
def left_path(root):
"
Recursively collects the values from the leftmost path of the binary tree starting from the given node.
Returns a list of the collected values.
"
if root is None:
return []
# Recursively collect values from the leftmost path
return [root.val] + left_path(root.left)
5: R-eview
Review the code by running specific example(s) and recording values (watchlist) of your code's variables along the way.
- Validate the code with trees of varying depths and configurations to ensure all possible paths are correctly identified and collected.
6: E-valuate
Evaluate the performance of your algorithm and state any strong/weak or future potential work.
- Time Complexity:
O(h)
where h is the height of the tree, typicallyO(log n)
in a balanced tree but could beO(n)
in a skewed tree. - Space Complexity:
O(h)
due to the recursion stack, with the worst-case space usage beingO(n)
in a highly skewed tree.