Learn how to flatten a binary tree to a linked list.
Given a binary tree we have to arrange all the elements of it to the right node of the parent node such that the new tree looks like a linked list and do this in place.
Example
Input:
1
/ \
2 5
/ \ \
3 4 6
Output:
1
\
2
\
3
\
4
\
5
\
6

We are going to see two different solutions for this.
1. Which works using an extra data structure (stack or queue). Queue for our case.
2. A recursive approach using DFS.
Flatten a binary tree to a linked list using queue.
Conceptually this is how it works.
- Traverse the binary tree using pre-order traversal and store each element in the queue.
- Then iterate the queue and add them to the right of the parent node in binary tree.
const flatten = (root) => {
const head = root;
let queue = [];
//To create new element
class Node {
constructor(key){
this.key = key,
this.left = null,
this.right = null
}
}
//Store each element of tree in a queue using pre-order traversal
(function traverse(root){
if (!root) return;
queue.push(root.key);
traverse(root.left)
traverse(root.right)
}(head));
//Update all the elements to the right
(function change(root){
if (!root) return;
queue.shift();
root.right = root.left = null;
while(queue.length) {
const val = queue.shift();
root.right = new Node(val);
root = root.right;
}
}(root));
};
Input:
const tree = new BST();
tree.insert(11);
tree.insert(7);
tree.insert(15);
tree.insert(5);
tree.insert(3);
tree.insert(9);
const root = tree.getHead();
flatten(root);
console.log(root);
Output:
11
\
7
\
5
\
3
\
9
\
15
Time complexity: O(n)(tree traversal) + O(n)(queue) = O(n).
Space complexity: O(n).
Flatten a binary tree using DFS.
In this approach we traverse the tree and get each node keep adding to the right of parent node.
const flatten = (root) => {
(function dfs(root, newTail = null) {
if (!root) return newTail;
//Traverse the list with DFS
const right = dfs(root.right, newTail) || newTail;
const left = dfs(root.left, right);
//Flatten the tree
root.right = left;
root.left = null;
return root;
}(root))
}
Input:
const tree = new BST();
tree.insert(11);
tree.insert(7);
tree.insert(15);
tree.insert(5);
tree.insert(3);
tree.insert(9);
const root = tree.getHead();
flatten(root);
console.log(root);
Output:
11
\
7
\
5
\
3
\
9
\
15
Time complexity: O(n).
Space complexity: O(n) considering the call stack.