Verify and modify inorder subsequence
Company: Airbnb
Role: Software Engineer
Category: Coding & Algorithms
Difficulty: medium
Interview Round: Technical Screen
Quick Answer: This question evaluates algorithm design and data-structure manipulation in the Coding & Algorithms domain, focusing on binary tree inorder traversal, subsequence detection, and computing the minimum edit operations under strict time and space constraints.
Part 1: Verify an Inorder Subsequence with Morris Traversal
Constraints
- 0 <= number of serialized entries in tree <= 100000
- 0 <= len(sequence) <= 100000
- If tree is non-empty, tree[0] is not None
- Node values and sequence values are integers in the range [-10^9, 10^9]
- Duplicate values are allowed
Examples
Input: ([2, 1, 3], [1, 3])
Expected Output: True
Explanation: The inorder traversal is [1, 2, 3], and [1, 3] appears in order.
Input: ([2, 1, 3], [3, 1])
Expected Output: False
Explanation: The values exist, but not in inorder subsequence order.
Hints
- You only need one pointer into sequence while scanning the inorder traversal.
- Morris traversal visits nodes in inorder without a recursion stack by temporarily threading predecessor pointers.
Part 2: Modify the Tree by Appending the Unmatched Inorder Suffix
Constraints
- 0 <= number of serialized entries in tree <= 10000
- 0 <= len(sequence) <= 10000
- If tree is non-empty, tree[0] is not None
- Values are integers in the range [-10^9, 10^9]
- Duplicate values are allowed
Examples
Input: ([2, 1, 3], [1, 4])
Expected Output: [2, 1, 3, None, None, None, 4]
Explanation: The original inorder is [1, 2, 3], which matches prefix [1]. The remaining value 4 is appended at the end as a new right child of the inorder-last node.
Input: ([2, 1, 3], [1, 2])
Expected Output: [2, 1, 3]
Explanation: The sequence is already a subsequence of the original inorder traversal, so no nodes are added.
Hints
- Greedily match as much of the sequence as possible during an inorder traversal of the original tree.
- Adding a right-child chain to the inorder-last node appends values at the very end of the inorder traversal.
Part 3: Minimum Operations to Force an Inorder Subsequence
Constraints
- 0 <= number of serialized entries in tree <= 2000
- 0 <= len(sequence) <= 2000
- If tree is non-empty, tree[0] is not None
- Values are integers in the range [-10^9, 10^9]
- Duplicate values are allowed
Examples
Input: ([2, 1, 3], [1, 3])
Expected Output: 0
Explanation: The inorder traversal is already [1, 2, 3], so the target sequence already appears.
Input: ([2, 1, 3], [1, 4, 3])
Expected Output: 1
Explanation: Keep 1 and 3, then either change the middle node to 4 or insert 4 once.
Hints
- A target value costs 0 only if you can keep some existing inorder node with the same value in the correct relative order.
- So the problem becomes: maximize how many target values are already matched in order, then pay 1 for every remaining target value.