Given a Binary Tree, the task is to flatten it in order of Level order 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 5 2 6 4 9 3
Input:
1
\
2
\
3
\
4
\
5
Output: 1 2 3 4 5
Approach: We will solve this problem by simulating the Level order traversal of Binary Tree as follows:
- Create a queue to store the nodes of Binary tree.
- Create a variable “prev” and initialise it by parent node.
- Push left and right children of parent in the queue.
- Apply level order traversal. Lets say “curr” is front most element in queue. Then,
- If ‘curr’ is NULL, continue.
- Else push curr->left and curr->right in the queue
- Set prev = curr
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
struct node {
int data;
node* left;
node* right;
node( int data)
{
this ->data = data;
left = NULL;
right = NULL;
}
};
void flatten(node* parent)
{
queue<node*> q;
q.push(parent->left);
q.push(parent->right);
node* prev = parent;
while (q.size()) {
int s = q.size();
while (s--) {
node* curr = q.front();
q.pop();
if (curr == NULL)
continue ;
prev->right = curr;
prev->left = NULL;
prev = curr;
q.push(curr->left);
q.push(curr->right);
}
}
prev->left = NULL;
prev->right = NULL;
}
void print(node* parent)
{
node* curr = parent;
while (curr != NULL)
cout << curr->data << " " , curr = curr->right;
}
int main()
{
node* root = new node(1);
root->left = new node(5);
root->right = new node(2);
root->left->left = new node(6);
root->left->right = new node(4);
root->right->left = new node(9);
root->right->right = new node(3);
flatten(root);
print(root);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static class node
{
int data;
node left;
node right;
node( int data)
{
this .data = data;
left = null ;
right = null ;
}
};
static void flatten(node parent)
{
Queue<node> q = new LinkedList<>();
q.add(parent.left);
q.add(parent.right);
node prev = parent;
while (q.size() > 0 )
{
int s = q.size();
while (s-- > 0 )
{
node curr = q.peek();
q.remove();
if (curr == null )
continue ;
prev.right = curr;
prev.left = null ;
prev = curr;
q.add(curr.left);
q.add(curr.right);
}
}
prev.left = null ;
prev.right = null ;
}
static void print(node parent)
{
node curr = parent;
while (curr != null )
{
System.out.print(curr.data + " " );
curr = curr.right;
}
}
public static void main(String[] args)
{
node root = new node( 1 );
root.left = new node( 5 );
root.right = new node( 2 );
root.left.left = new node( 6 );
root.left.right = new node( 4 );
root.right.left = new node( 9 );
root.right.right = new node( 3 );
flatten(root);
print(root);
}
}
|
Python3
class node:
def __init__( self , key):
self .data = key
self .left = self .right = None
def flatten( parent):
q = []
q.append(parent.left)
q.append(parent.right)
prev = parent
while ( len (q) > 0 ) :
s = len (q)
while (s > 0 ) :
s = s - 1
curr = q[ 0 ]
q.pop( 0 )
if (curr = = None ):
continue
prev.right = curr
prev.left = None
prev = curr
q.append(curr.left)
q.append(curr.right)
prev.left = None
prev.right = None
def print_(parent):
curr = parent
while (curr ! = None ):
print ( curr.data , end = " " )
curr = curr.right
root = node( 1 )
root.left = node( 5 )
root.right = node( 2 )
root.left.left = node( 6 )
root.left.right = node( 4 )
root.right.left = node( 9 )
root.right.right = node( 3 )
flatten(root)
print_(root)
|
C#
using System;
using System.Collections.Generic;
class GFG
{
public class node
{
public int data;
public node left;
public node right;
public node( int data)
{
this .data = data;
left = null ;
right = null ;
}
};
static void flatten(node parent)
{
Queue<node> q = new Queue<node>();
q.Enqueue(parent.left);
q.Enqueue(parent.right);
node prev = parent;
while (q.Count > 0)
{
int s = q.Count;
while (s-- > 0)
{
node curr = q.Peek();
q.Dequeue();
if (curr == null )
continue ;
prev.right = curr;
prev.left = null ;
prev = curr;
q.Enqueue(curr.left);
q.Enqueue(curr.right);
}
}
prev.left = null ;
prev.right = null ;
}
static void print(node parent)
{
node curr = parent;
while (curr != null )
{
Console.Write(curr.data + " " );
curr = curr.right;
}
}
public static void Main(String[] args)
{
node root = new node(1);
root.left = new node(5);
root.right = new node(2);
root.left.left = new node(6);
root.left.right = new node(4);
root.right.left = new node(9);
root.right.right = new node(3);
flatten(root);
print(root);
}
}
|
Javascript
<script>
class node
{
constructor(data)
{
this .data = data;
this .left = null ;
this .right = null ;
}
}
function flatten(parent)
{
let q = [];
q.push(parent.left);
q.push(parent.right);
let prev = parent;
while (q.length > 0)
{
let s = q.length;
while (s-- > 0)
{
let curr = q.shift();
if (curr == null )
continue ;
prev.right = curr;
prev.left = null ;
prev = curr;
q.push(curr.left);
q.push(curr.right);
}
}
prev.left = null ;
prev.right = null ;
}
function print(parent)
{
let curr = parent;
while (curr != null )
{
document.write(curr.data + " " );
curr = curr.right;
}
}
let root = new node(1);
root.left = new node(5);
root.right = new node(2);
root.left.left = new node(6);
root.left.right = new node(4);
root.right.left = new node(9);
root.right.right = new node(3);
flatten(root);
print(root);
</script>
|
Output :
1 5 2 6 4 9 3
Time Complexity: O(N)
Space Complexity: O(N) where N is the size of Binary Tree.