We can solve this recursively by processing the tree in reverse pre-order (Right -> Left -> Root). We maintain a prev pointer that points to the previously processed node and attach it to the current node's right.
- Initialize
prev = None. - Define a helper
flatten(node):- If
nodeis None, return. - Recurse on the right:
flatten(node.right). - Recurse on the left:
flatten(node.left). - Set
node.right = prev. - Set
node.left = None. - Update
prev = node.
- If
- The main function calls
flatten(root).
- Time Complexity: O(N).
- Space Complexity: O(H).
def flatten(root):
prev = None
def helper(node):
nonlocal prev
if not node:
return
# Reverse preorder: Right, then Left, then Root
helper(node.right)
helper(node.left)
node.right = prev
node.left = None
prev = node
helper(root)