Reference: LeetCode
Difficulty: Medium
Problem
Given a binary tree, flatten it to a linked list in-place.
Example:
1  | 1  | 
The flattened tree should look like:
1  | 1  | 
Analysis
Preorder
1  | 1  | 
The idea is to use preorder traversal. For example, when root = 1, we want to set 1.right as 2 and set 4.right as 5.
Notice that to know where 4 is during the traversal, we can use a prev node to keep track of the previous node. The previous node of 1 is 4.
Note: I know the code could be shorter, but I think shorter code is barely readable!
1  | private TreeNode prevNode = null;  | 
Time: $O(N)$
Space: $O(h)$
Recursive Function
Note: Just a bit modification on the previous solution.
This idea is a more recursive idea. Let’s say we have a flatten() function. For node 1, we can flatten its two children 2 and 5. At that time, we don’t need to know the detail but we are sure that we will have:
1  | 1 1 // root  | 
Two subproblems have been flattened.
1  | private TreeNode prevNode = null;  | 
Time: $O(N)$
Space: $O(N)$
LeetCode Solution
More like reversed postorder!
I don’t like this following method neither.
1  | private TreeNode prev = null;  | 
Other Solution: (not using field variable)
1  | public void flatten(TreeNode root) {  | 
Time: $O(N)$
Space: $O(h)$
Iteration (Preorder)
Use a stack to simulate the preorder traversal, but we also use peek operation to set current node’s right child to its left child.
1  | 1  | 
![]()
Note:
- Before 
peeking, remember to check if the stack is empty. - Actually, we don’t have to check the stack’s size before calling 
peek(). If the stack is empty, it will just returnnull. But it does not hold true forStack‘speek(). 
1  | public void flatten(TreeNode root) {  | 
Time: $O(N)$
Space: $O(h)$