Flatten a binary tree into linked list
Last Updated :
07 Nov, 2023
Given a binary tree, flatten it into linked list in-place. Usage of auxiliary data structure is not allowed. After flattening, left of each node should point to NULL and right should contain next node in preorder.
Examples:
Input :
1
/ \
2 5
/ \ \
3 4 6
Output :
1
\
2
\
3
\
4
\
5
\
6
Input :
1
/ \
3 4
/
2
\
5
Output :
1
\
3
\
4
\
2
\
5
Simple Approach: A simple solution is to use Level Order Traversal using Queue. In level order traversal, keep track of previous node. Make current node as right child of previous and left of previous node as NULL. This solution requires queue, but question asks to solve without additional data structure.
Efficient Without Additional Data Structure Recursively look for the node with no grandchildren and both left and right child in the left sub-tree. Then store node->right in temp and make node->right=node->left. Insert temp in first node NULL on right of node by node=node->right. Repeat until it is converted to linked list. Even though this approach does not require additional data structure , but still it takes space for Recursion stack.
For Example,

Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int key;
Node *left, *right;
};
Node* newNode( int key)
{
Node* node = new Node;
node->key = key;
node->left = node->right = NULL;
return (node);
}
void flatten( struct Node* root)
{
if (root == NULL || root->left == NULL && root->right == NULL)
return ;
if (root->left != NULL) {
flatten(root->left);
struct Node* tmpRight = root->right;
root->right = root->left;
root->left = NULL;
struct Node* t = root->right;
while (t->right != NULL)
t = t->right;
t->right = tmpRight;
}
flatten(root->right);
}
void inorder( struct Node* root)
{
if (root == NULL)
return ;
inorder(root->left);
cout << root->key << " " ;
inorder(root->right);
}
int main()
{
Node* root = newNode(1);
root->left = newNode(2);
root->right = newNode(5);
root->left->left = newNode(3);
root->left->right = newNode(4);
root->right->right = newNode(6);
flatten(root);
cout << "The Inorder traversal after flattening binary tree " ;
inorder(root);
return 0;
}
|
C
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int key;
struct Node *left, *right;
}Node;
Node* newNode( int key)
{
Node* node = (Node*) malloc ( sizeof (Node));
node->key = key;
node->left = node->right = NULL;
return (node);
}
void flatten(Node* root)
{
if (root == NULL || root->left == NULL && root->right == NULL)
return ;
if (root->left != NULL) {
flatten(root->left);
struct Node* tmpRight = root->right;
root->right = root->left;
root->left = NULL;
struct Node* t = root->right;
while (t->right != NULL)
t = t->right;
t->right = tmpRight;
}
flatten(root->right);
}
void inorder( struct Node* root)
{
if (root == NULL)
return ;
inorder(root->left);
printf ( "%d " , root->key);
inorder(root->right);
}
int main()
{
Node* root = newNode(1);
root->left = newNode(2);
root->right = newNode(5);
root->left->left = newNode(3);
root->left->right = newNode(4);
root->right->right = newNode(6);
flatten(root);
printf ( "The Inorder traversal after flattening binary tree " );
inorder(root);
return 0;
}
|
Java
class Node {
int data;
Node left, right;
Node( int key)
{
data = key;
left = right = null ;
}
}
class BinaryTree {
Node root;
public void flatten(Node node)
{
if (node == null )
return ;
if (node.left == null && node.right == null )
return ;
if (node.left != null ) {
flatten(node.left);
Node tempNode = node.right;
node.right = node.left;
node.left = null ;
Node curr = node.right;
while (curr.right != null )
curr = curr.right;
curr.right = tempNode;
}
flatten(node.right);
}
public void inOrder(Node node)
{
if (node == null )
return ;
inOrder(node.left);
System.out.print(node.data + " " );
inOrder(node.right);
}
public static void main(String[] args)
{
BinaryTree tree = new BinaryTree();
tree.root = new Node( 1 );
tree.root.left = new Node( 2 );
tree.root.right = new Node( 5 );
tree.root.left.left = new Node( 3 );
tree.root.left.right = new Node( 4 );
tree.root.right.right = new Node( 6 );
System.out.println(
"The Inorder traversal after flattening binary tree " );
tree.flatten(tree.root);
tree.inOrder(tree.root);
}
}
|
Python3
class Node:
def __init__( self ):
self .key = 0
self .left = None
self .right = None
def newNode(key):
node = Node()
node.key = key
node.left = node.right = None
return (node)
def flatten(root):
if (root = = None or root.left = = None and
root.right = = None ):
return
if (root.left ! = None ):
flatten(root.left)
tmpRight = root.right
root.right = root.left
root.left = None
t = root.right
while (t.right ! = None ):
t = t.right
t.right = tmpRight
flatten(root.right)
def inorder(root):
if (root = = None ):
return
inorder(root.left)
print (root.key, end = ' ' )
inorder(root.right)
if __name__ = = '__main__' :
root = newNode( 1 )
root.left = newNode( 2 )
root.right = newNode( 5 )
root.left.left = newNode( 3 )
root.left.right = newNode( 4 )
root.right.right = newNode( 6 )
flatten(root)
print ( "The Inorder traversal after "
"flattening binary tree " ,
end = '')
inorder(root)
|
C#
using System;
class Node
{
public int data;
public Node left, right;
public Node( int key)
{
data = key;
left = right = null ;
}
}
class BinaryTree
{
Node root;
public void flatten(Node node)
{
if (node == null )
return ;
if (node.left == null &&
node.right == null )
return ;
if (node.left != null )
{
flatten(node.left);
Node tempNode = node.right;
node.right = node.left;
node.left = null ;
Node curr = node.right;
while (curr.right != null )
{
curr = curr.right;
}
curr.right = tempNode;
}
flatten(node.right);
}
public void inOrder(Node node)
{
if (node == null )
return ;
inOrder(node.left);
Console.Write(node.data + " " );
inOrder(node.right);
}
public static void Main( string [] args)
{
BinaryTree tree = new BinaryTree();
tree.root = new Node(1);
tree.root.left = new Node(2);
tree.root.right = new Node(5);
tree.root.left.left = new Node(3);
tree.root.left.right = new Node(4);
tree.root.right.right = new Node(6);
Console.Write( "The Inorder traversal after " +
"flattening binary tree " );
tree.flatten(tree.root);
tree.inOrder(tree.root);
}
}
|
Javascript
<script>
class Node
{
constructor(key)
{
this .data = key;
this .left = null ;
this .right = null ;
}
}
var root;
function flatten(node)
{
if (node == null )
return ;
if (node.left == null &&
node.right == null )
return ;
if (node.left != null )
{
flatten(node.left);
var tempNode = node.right;
node.right = node.left;
node.left = null ;
var curr = node.right;
while (curr.right != null )
{
curr = curr.right;
}
curr.right = tempNode;
}
flatten(node.right);
}
function inOrder(node)
{
if (node == null )
return ;
inOrder(node.left);
document.write(node.data + " " );
inOrder(node.right);
}
root = new Node(1);
root.left = new Node(2);
root.right = new Node(5);
root.left.left = new Node(3);
root.left.right = new Node(4);
root.right.right = new Node(6);
document.write( "The Inorder traversal after " +
"flattening binary tree " );
flatten(root);
inOrder(root);
</script>
|
Output
The Inorder traversal after flattening binary tree 1 2 3 4 5 6
Complexity Analysis:
- Time Complexity: O(n), traverse the whole tree
- Space Complexity: O(n), Extra space used for recursion call.
Another Approach:
We will use the intuition behind Morris’s traversal. In Morris Traversal we use the concept of a threaded binary tree.
- At a node(say cur) if there exists a left child, we will find the rightmost node in the left subtree(say prev).
- We will set prev’s right child to cur’s right child,
- We will then set cur’s right child to it’s left child.
- We will then move cur to the next node by assigning cur it to its right child
- We will stop the execution when cur points to NULL.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int key;
Node *left, *right;
};
Node* newNode( int key)
{
Node* node = new Node;
node->key = key;
node->left = node->right = NULL;
return (node);
}
void flatten(Node* root)
{
while (root) {
if (root->left != NULL) {
Node* curr = root->left;
while (curr->right) {
curr = curr->right;
}
curr->right = root->right;
root->right = root->left;
root->left = NULL;
}
root = root->right;
}
}
void inorder( struct Node* root)
{
if (root == NULL)
return ;
inorder(root->left);
cout << root->key << " " ;
inorder(root->right);
}
int main()
{
Node* root = newNode(1);
root->left = newNode(2);
root->right = newNode(5);
root->left->left = newNode(3);
root->left->right = newNode(4);
root->right->right = newNode(6);
flatten(root);
cout << "The Inorder traversal after flattening binary "
"tree " ;
inorder(root);
return 0;
}
|
Java
import java.io.*;
class Node {
int key;
Node left, right;
}
class GFG {
static Node newNode( int key)
{
Node node = new Node();
node.key = key;
node.left = node.right = null ;
return node;
}
static void flatten(Node root)
{
while (root != null ) {
if (root.left != null ) {
Node curr = root.left;
while (curr.right != null ) {
curr = curr.right;
}
curr.right = root.right;
root.right = root.left;
root.left = null ;
}
root = root.right;
}
}
static void inorder(Node root)
{
if (root == null ) {
return ;
}
inorder(root.left);
System.out.print(root.key + " " );
inorder(root.right);
}
public static void main(String[] args)
{
Node root = newNode( 1 );
root.left = newNode( 2 );
root.right = newNode( 5 );
root.left.left = newNode( 3 );
root.left.right = newNode( 4 );
root.right.right = newNode( 6 );
flatten(root);
System.out.print(
"The Inorder traversal after flattening binary tree " );
inorder(root);
}
}
|
Python3
class Node:
def __init__( self ):
self .key = 0
self .left = None
self .right = None
def newNode(key):
node = Node()
node.key = key
node.left = node.right = None
return (node)
def flatten(root):
while (root ! = None ):
if (root.left ! = None ):
curr = root.left
while (curr.right ! = None ):
curr = curr.right
curr.right = root.right
root.right = root.left
root.left = None
root = root.right
def inorder(root):
if (root = = None ):
return
inorder(root.left)
print (root.key, end = ' ' )
inorder(root.right)
if __name__ = = '__main__' :
root = newNode( 1 )
root.left = newNode( 2 )
root.right = newNode( 5 )
root.left.left = newNode( 3 )
root.left.right = newNode( 4 )
root.right.right = newNode( 6 )
flatten(root)
print ( "The Inorder traversal after "
"flattening binary tree " ,
end = '')
inorder(root)
|
C#
using System;
class Node
{
public int data;
public Node left, right;
public Node( int key)
{
data = key;
left = right = null ;
}
}
class BinaryTree
{
Node root;
public void flatten(Node node)
{
while (node != null ){
if (node.left != null ){
Node curr = node.left;
while (curr.right != null ){
curr = curr.right;
}
curr.right = node.right;
node.right = node.left;
node.left = null ;
}
node = node.right;
}
}
public void inorder(Node node)
{
if (node == null )
return ;
inorder(node.left);
Console.Write(node.data + " " );
inorder(node.right);
}
public static void Main( string [] args)
{
BinaryTree tree = new BinaryTree();
tree.root = new Node(1);
tree.root.left = new Node(2);
tree.root.right = new Node(5);
tree.root.left.left = new Node(3);
tree.root.left.right = new Node(4);
tree.root.right.right = new Node(6);
Console.Write( "The Inorder traversal after " +
"flattening binary tree " );
tree.flatten(tree.root);
tree.inorder(tree.root);
}
}
|
Javascript
<script>
class Node
{
constructor(key)
{
this .data = key;
this .left = null ;
this .right = null ;
}
}
var root;
function flatten(root)
{
while (root){
if (root.left != null ){
curr = root.left;
while (curr.right){
curr = curr.right;
}
curr.right = root.right;
root.right = root.left;
root.left = null ;
}
root = root.right;
}
}
function inorder(root)
{
if (root == null )
return ;
inorder(root.left);
console.log(root.data + " " );
inorder(root.right);
}
root = new Node(1);
root.left = new Node(2);
root.right = new Node(5);
root.left.left = new Node(3);
root.left.right = new Node(4);
root.right.right = new Node(6);
console.log( "The Inorder traversal after " +
"flattening binary tree " );
flatten(root);
inorder(root);
</script>
|
Output
The Inorder traversal after flattening binary tree 1 2 3 4 5 6
Time Complexity: O(N) Time complexity will be the same as that of a Morris’s traversal
Auxiliary Space: O(1)
Another Approach Using Stack:
In this solution, we start by initializing a prev variable to None. This variable will keep track of the previously flattened node as we recursively flatten the binary tree.
- We then define a recursive function flatten that takes in the root node of the binary tree. This function does not return anything, but instead modifies the tree in-place.
- The first thing we do in the flatten function is to check if the root node is None. If it is, we simply return.
- Next, we recursively flatten the right subtree of the root node by calling self.flatten(root.right). This will flatten the right subtree and set self.prev to the rightmost node in the right subtree.
- We then recursively flatten the left subtree of the root node by calling self.flatten(root.left). This will flatten the left subtree and update self.prev to the rightmost node in the flattened left subtree.
- Once we have flattened both the left and right subtrees, we update the root.right pointer to be the previously flattened node (self.prev). We also set the root.left pointer to None to remove the left child.
- Finally, we update self.prev to be the current node (root). This is important because it allows us to keep track of the previously flattened node as we continue to recursively flatten the tree.
This algorithm flattens the binary tree in pre-order traversal, so the resulting “linked list” will be in the same order as a pre-order traversal of the tree.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int key;
Node *left, *right;
};
Node* newNode( int key)
{
Node* node = new Node;
node->key = key;
node->left = node->right = NULL;
return (node);
}
void flatten(Node* root)
{
stack<Node *>st;
st.push(root);
while (st.empty()!= true )
{
Node *curr = st.top();
st.pop();
if (curr==NULL) return ;
if (curr->right!=NULL) st.push(curr->right);
if (curr->left!=NULL) st.push(curr->left);
if (st.empty()!= true )
{
curr->right = st.top();
}
curr->left = NULL;
}
return ;
}
void inorder( struct Node* root)
{
if (root == NULL)
return ;
inorder(root->left);
cout << root->key << " " ;
inorder(root->right);
}
int main()
{
Node* root = newNode(1);
root->left = newNode(2);
root->right = newNode(5);
root->left->left = newNode(3);
root->left->right = newNode(4);
root->right->right = newNode(6);
flatten(root);
cout << "The Inorder traversal after flattening binary "
"tree " ;
inorder(root);
return 0;
}
|
Java
import java.io.*;
import java.util.Stack;
class Node {
int key;
Node left, right;
Node( int item) {
key = item;
left = right = null ;
}
}
public class GFG {
public static void flatten(Node root) {
if (root == null ) {
return ;
}
Stack<Node> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
Node current = stack.pop();
if (current.right != null ) {
stack.push(current.right);
}
if (current.left != null ) {
stack.push(current.left);
}
if (!stack.isEmpty()) {
current.right = stack.peek();
}
current.left = null ;
}
}
public static void inorder(Node root) {
if (root == null ) {
return ;
}
inorder(root.left);
System.out.print(root.key + " " );
inorder(root.right);
}
public static void main(String[] args) {
Node root = new Node( 1 );
root.left = new Node( 2 );
root.right = new Node( 5 );
root.left.left = new Node( 3 );
root.left.right = new Node( 4 );
root.right.right = new Node( 6 );
flatten(root);
System.out.print( "Inorder traversal after flattening binary tree " );
inorder(root);
}
}
|
Python3
class TreeNode:
def __init__( self , key):
self .key = key
self .left = None
self .right = None
def flatten(root):
if not root:
return
stack = [root]
while stack:
curr = stack.pop()
if not curr:
continue
if curr.right:
stack.append(curr.right)
if curr.left:
stack.append(curr.left)
if stack:
curr.right = stack[ - 1 ]
curr.left = None
def inorder(root):
if not root:
return
inorder(root.left)
print (root.key, end = ' ' )
inorder(root.right)
if __name__ = = "__main__" :
root = TreeNode( 1 )
root.left = TreeNode( 2 )
root.right = TreeNode( 5 )
root.left.left = TreeNode( 3 )
root.left.right = TreeNode( 4 )
root.right.right = TreeNode( 6 )
flatten(root)
print ( "The Inorder traversal after flattening binary tree:" )
inorder(root)
|
C#
using System;
using System.Collections.Generic;
public class Node {
public int key;
public Node left, right;
}
public class FlattenBinaryTreeToLinkedList {
static Node NewNode( int key) {
Node node = new Node();
node.key = key;
node.left = node.right = null ;
return node;
}
static void Flatten(Node root) {
if (root == null ) return ;
Stack<Node> stack = new Stack<Node>();
stack.Push(root);
while (stack.Count != 0) {
Node curr = stack.Pop();
if (curr == null ) continue ;
if (curr.right != null ) stack.Push(curr.right);
if (curr.left != null ) stack.Push(curr.left);
if (stack.Count != 0) {
curr.right = stack.Peek();
}
curr.left = null ;
}
}
static void Inorder(Node root) {
if (root == null ) return ;
Inorder(root.left);
Console.Write(root.key + " " );
Inorder(root.right);
}
public static void Main( string [] args) {
Node root = NewNode(1);
root.left = NewNode(2);
root.right = NewNode(5);
root.left.left = NewNode(3);
root.left.right = NewNode(4);
root.right.right = NewNode(6);
Flatten(root);
Console.Write( "The Inorder traversal after flattening binary tree " );
Inorder(root);
}
}
|
Javascript
class TreeNode {
constructor(key) {
this .key = key;
this .left = null ;
this .right = null ;
}
}
function flatten(root) {
const stack = [root];
while (stack.length > 0) {
const curr = stack.pop();
if (curr === null ) {
return ;
}
if (curr.right !== null ) {
stack.push(curr.right);
}
if (curr.left !== null ) {
stack.push(curr.left);
}
if (stack.length > 0) {
curr.right = stack[stack.length - 1];
}
curr.left = null ;
}
}
function inorder(root) {
if (root === null ) {
return ;
}
inorder(root.left);
console.log(root.key + " " );
inorder(root.right);
}
function main() {
const root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(5);
root.left.left = new TreeNode(3);
root.left.right = new TreeNode(4);
root.right.right = new TreeNode(6);
flatten(root);
console.log( "The Inorder traversal after flattening binary tree:" );
inorder(root);
}
main();
|
Output
The Inorder traversal after flattening binary tree 1 2 3 4 5 6
Time Complexity: O(N), The loop will execute for every node once.
Space Complexity: O(N), Auxiliary Stack Space is needed.
Similar Reads
Flatten a binary tree into linked list | Set-2
Given a binary tree, flatten it into a linked list. After flattening, the left of each node should point to NULL and right should contain next node in level order. Example: Input: 1 / \ 2 5 / \ \ 3 4 6 Output: 1 \ 2 \ 3 \ 4 \ 5 \ 6 Input: 1 / \ 3 4 / 2 \ 5 Output: 1 \ 3 \ 4 \ 2 \ 5 Approach: An appr
9 min read
C++ Program For Flattening A Linked List
Given a linked list where every node represents a linked list and contains two pointers of its type: Pointer to next node in the main list (we call it 'right' pointer in the code below).Pointer to a linked list where this node is headed (we call it the 'down' pointer in the code below). All linked l
4 min read
C++ Program For Flattening A Multilevel Linked List
Given a linked list where in addition to the next pointer, each node has a child pointer, which may or may not point to a separate list. These child lists may have one or more children of their own, and so on, to produce a multilevel data structure, as shown below figure. You are given the head of t
5 min read
Flatten Binary Tree in order of Zig Zag traversal
Given a Binary Tree, the task is to flatten it in order of ZigZag traversal of the tree. In the flattened binary tree, the left node of all the nodes must be NULL.Examples: Input: 1 / \ 5 2 / \ / \ 6 4 9 3 Output: 1 2 5 6 4 9 3 Input: 1 \ 2 \ 3 \ 4 \ 5 Output: 1 2 3 4 5 Approach: We will solve this
7 min read
How to Print Data in Binary Tree Level by Level in C++?
A binary tree is a non-linear hierarchical data structure where each node can have at most two children which are termed as left and right child. In this article, we will learn how to print data in a binary tree level by level in C++. Example Input: 10 / \ 20 30 / \ / \40 50 60 70Output:10 20 30 40
4 min read
Print nodes in top view of Binary Tree | Set 2
Top view of a binary tree is the set of nodes visible when the tree is viewed from the top. Given a binary tree, print the top view of it. The output nodes should be printed from left to right. Note: A node x is there in output if x is the topmost node at its horizontal distance. Horizontal distance
14 min read
Binary Search Tree in C++
A Binary Search Tree (BST) is a type of binary tree in which the data is organized and stored in a sorted order. Unlike, a binary tree that doesn't follow a specific order for node placement, in a binary search tree all the elements on the left side of a node are smaller than the node itself, and el
10 min read
C++ Program To Flatten A Multi-Level Linked List Depth Wise- Set 2
We have discussed flattening of a multi-level linked list where nodes have two pointers down and next. In the previous post, we flattened the linked list level-wise. How to flatten a linked list when we always need to process the down pointer before next at every node. Input: 1 - 2 - 3 - 4 | 7 - 8 -
4 min read
Convert Binary Tree to Circular Doubly Linked List using Linear extra space
Given a Binary Tree, convert it to a Circular Doubly Linked List. The left and right pointers in nodes are to be used as previous and next pointers, respectively, in the converted Circular Linked List.The order of nodes in the List must be the same as in the order of the given Binary Tree.The first
12 min read
Connect all nodes to their Left Neighbors in a Binary Tree
Given a Binary Tree, where each node contains an extra empty pointer initially null. The task is to connect all nodes of the binary tree to their left neighbor at the same level using this extra pointer.Examples: Input : A / \ B C / \ \ D E F Output : NULL<--A / \ NULL<--B<--C / \ \ NULL
10 min read