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)$