Create a sorted linked list from the given Binary Tree
Last Updated :
14 Apr, 2023
Given a binary tree, the task is to convert it into a sorted linked list.
Examples:
Input:
1
/ \
2 3
Output: 1 2 3
Input:
2
/ \
4 8
/ \ / \
7 3 5 1
Output: 1 2 3 4 5 7 8
Input:
3
/
4
/
1
/
9
Output: 1 3 4 9
Approach: Recursively iterate the given binary tree and add each node to its correct position in the resultant linked list (initially empty) using insertion sort.
Below is the implementation of the above approach:
- C++
- Java
- C#
- Python3
- Javascript
C++
#include <iostream>
using namespace std;
class Node {
public :
int data;
Node* next;
Node( int data)
{
this ->data = data;
this ->next = NULL;
}
};
class treeNode {
public :
int data;
treeNode* left;
treeNode* right;
treeNode( int data)
{
this ->data = data;
this ->left = NULL;
this ->right = NULL;
}
};
void print(Node* head)
{
if (head == NULL) {
return ;
}
Node* temp = head;
while (temp != NULL) {
cout << temp->data << " " ;
temp = temp->next;
}
}
Node* sortedList(Node* head, treeNode* root)
{
if (root == NULL) {
return head;
}
head = sortedList(head, root->left);
Node* newNode = new Node(root->data);
Node* temp = head;
Node* prev = NULL;
if (temp == NULL) {
head = newNode;
}
else {
while (temp != NULL) {
if (temp->data > root->data) {
break ;
}
else {
prev = temp;
temp = temp->next;
}
}
if (temp == NULL) {
prev->next = newNode;
}
else {
if (prev == NULL) {
newNode->next = temp;
head = newNode;
}
else {
newNode->next = temp;
prev->next = newNode;
}
}
}
head = sortedList(head, root->right);
return head;
}
int main()
{
treeNode* root = new treeNode(10);
root->left = new treeNode(15);
root->right = new treeNode(2);
root->left->left = new treeNode(1);
root->left->right = new treeNode(5);
Node* head = sortedList(NULL, root);
print(head);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static class Node
{
int data;
Node next;
Node( int data)
{
this .data = data;
this .next = null ;
}
};
static class treeNode
{
int data;
treeNode left;
treeNode right;
treeNode( int data)
{
this .data = data;
this .left = null ;
this .right = null ;
}
};
static void print(Node head)
{
if (head == null )
{
return ;
}
Node temp = head;
while (temp != null )
{
System.out.print(temp.data + " " );
temp = temp.next;
}
}
static Node sortedList(Node head, treeNode root)
{
if (root == null )
{
return head;
}
head = sortedList(head, root.left);
Node newNode = new Node(root.data);
Node temp = head;
Node prev = null ;
if (temp == null )
{
head = newNode;
}
else
{
while (temp != null )
{
if (temp.data > root.data)
{
break ;
}
else
{
prev = temp;
temp = temp.next;
}
}
if (temp == null )
{
prev.next = newNode;
}
else
{
if (prev == null )
{
newNode.next = temp;
head = newNode;
}
else
{
newNode.next = temp;
prev.next = newNode;
}
}
}
head = sortedList(head, root.right);
return head;
}
public static void main(String[] args)
{
treeNode root = new treeNode( 10 );
root.left = new treeNode( 15 );
root.right = new treeNode( 2 );
root.left.left = new treeNode( 1 );
root.left.right = new treeNode( 5 );
Node head = sortedList( null , root);
print(head);
}
}
|
C#
using System;
class GFG
{
class Node
{
public int data;
public Node next;
public Node( int data)
{
this .data = data;
this .next = null ;
}
};
class treeNode
{
public int data;
public treeNode left;
public treeNode right;
public treeNode( int data)
{
this .data = data;
this .left = null ;
this .right = null ;
}
};
static void print(Node head)
{
if (head == null )
{
return ;
}
Node temp = head;
while (temp != null )
{
Console.Write(temp.data + " " );
temp = temp.next;
}
}
static Node sortedList(Node head, treeNode root)
{
if (root == null )
{
return head;
}
head = sortedList(head, root.left);
Node newNode = new Node(root.data);
Node temp = head;
Node prev = null ;
if (temp == null )
{
head = newNode;
}
else
{
while (temp != null )
{
if (temp.data > root.data)
{
break ;
}
else
{
prev = temp;
temp = temp.next;
}
}
if (temp == null )
{
prev.next = newNode;
}
else
{
if (prev == null )
{
newNode.next = temp;
head = newNode;
}
else
{
newNode.next = temp;
prev.next = newNode;
}
}
}
head = sortedList(head, root.right);
return head;
}
public static void Main(String[] args)
{
treeNode root = new treeNode(10);
root.left = new treeNode(15);
root.right = new treeNode(2);
root.left.left = new treeNode(1);
root.left.right = new treeNode(5);
Node head = sortedList( null , root);
print(head);
}
}
|
Python3
class Node:
def __init__( self , data = 0 ):
self .data = data
self . next = None
class treeNode:
def __init__( self , data):
self .data = data
self .left = None
self .right = None
def print_(head):
if (head = = None ):
return
temp = head
while (temp ! = None ):
print ( temp.data, end = " " )
temp = temp. next
def sortedList( head, root):
if (root = = None ) :
return head
head = sortedList(head, root.left)
newNode = Node(root.data)
temp = head
prev = None
if (temp = = None ) :
head = newNode
else :
while (temp ! = None ):
if (temp.data > root.data) :
break
else :
prev = temp
temp = temp. next
if (temp = = None ):
prev. next = newNode
else :
if (prev = = None ) :
newNode. next = temp
head = newNode
else :
newNode. next = temp
prev. next = newNode
head = sortedList(head, root.right)
return head
root = treeNode( 10 )
root.left = treeNode( 15 )
root.right = treeNode( 2 )
root.left.left = treeNode( 1 )
root.left.right = treeNode( 5 )
head = sortedList( None , root)
print_(head)
|
Javascript
<script>
class Node {
constructor(data)
{
this .data = data;
this .next = null ;
}
};
class treeNode {
constructor(data)
{
this .data = data;
this .left = null ;
this .right = null ;
}
};
function print(head)
{
if (head == null ) {
return ;
}
var temp = head;
while (temp != null ) {
document.write( temp.data + " " );
temp = temp.next;
}
}
function sortedList(head, root)
{
if (root == null ) {
return head;
}
head = sortedList(head, root.left);
var newNode = new Node(root.data);
var temp = head;
var prev = null ;
if (temp == null ) {
head = newNode;
}
else {
while (temp != null ) {
if (temp.data > root.data) {
break ;
}
else {
prev = temp;
temp = temp.next;
}
}
if (temp == null ) {
prev.next = newNode;
}
else {
if (prev == null ) {
newNode.next = temp;
head = newNode;
}
else {
newNode.next = temp;
prev.next = newNode;
}
}
}
head = sortedList(head, root.right);
return head;
}
var root = new treeNode(10);
root.left = new treeNode(15);
root.right = new treeNode(2);
root.left.left = new treeNode(1);
root.left.right = new treeNode(5);
var head = sortedList( null , root);
print(head);
</script>
|
Time Complexity: O(n2)
Auxiliary Space: O(n)
Another Approach(Using extra space):
Follow the below steps to solve the problem:
1) Create an array to store the all elements of given binary tree.
2) Sort the given array in O(NlogN) time and then traverse the sorted array.
3) While traversing the sorted array then create given linked list for each element.
4) print the created sorted linked list.
Below is the implementation of above approach:
- C++
- Java
- Python
- C#
- Javascript
C++
#include<bits/stdc++.h>
using namespace std;
struct LNode{
int data;
LNode* next;
LNode( int data){
this ->data = data;
this ->next = NULL;
}
};
struct TNode{
int data;
TNode* left;
TNode* right;
TNode( int data){
this ->data = data;
this ->left = NULL;
this ->right = NULL;
}
};
void printList(LNode* head){
if (head == NULL) return ;
LNode* temp = head;
while (temp != NULL){
cout<<temp->data<< " " ;
temp = temp->next;
}
cout<<endl;
}
void inOrder(TNode* root, vector< int > &vec){
if (root == NULL) return ;
inOrder(root->left, vec);
vec.push_back(root->data);
inOrder(root->right, vec);
}
LNode* sortedList(TNode* root){
vector< int > vec;
inOrder(root, vec);
sort(vec.begin(), vec.end());
LNode* head = new LNode(-1);
LNode* temp = head;
for ( int i : vec){
temp->next = new LNode(i);
temp = temp->next;
}
head = head->next;
return head;
}
int main(){
TNode* root = new TNode(10);
root->left = new TNode(15);
root->right = new TNode(2);
root->left->left = new TNode(1);
root->left->right = new TNode(5);
LNode* head = sortedList(root);
printList(head);
return 0;
}
|
Java
import java.util.*;
class LNode{
int data;
LNode next;
LNode( int data){
this .data = data;
this .next = null ;
}
}
class TNode{
int data;
TNode left;
TNode right;
TNode( int data){
this .data = data;
this .left = null ;
this .right = null ;
}
}
class Main{
static void printList(LNode head){
if (head == null ) return ;
LNode temp = head;
while (temp != null ){
System.out.print(temp.data+ " " );
temp = temp.next;
}
System.out.println();
}
static void inOrder(TNode root, ArrayList<Integer> vec){
if (root == null ) return ;
inOrder(root.left, vec);
vec.add(root.data);
inOrder(root.right, vec);
}
static LNode sortedList(TNode root){
ArrayList<Integer> vec = new ArrayList<Integer>();
inOrder(root, vec);
Collections.sort(vec);
LNode head = new LNode(- 1 );
LNode temp = head;
for ( int i : vec){
temp.next = new LNode(i);
temp = temp.next;
}
head = head.next;
return head;
}
public static void main(String[] args){
TNode root = new TNode( 10 );
root.left = new TNode( 15 );
root.right = new TNode( 2 );
root.left.left = new TNode( 1 );
root.left.right = new TNode( 5 );
LNode head = sortedList(root);
printList(head);
}
}
|
Python
class LNode:
def __init__( self , data):
self .data = data
self . next = None
class TNode:
def __init__( self , data):
self .data = data
self .left = None
self .right = None
def printList(head):
if (head is None ):
return
temp = head
while (temp is not None ):
print (temp.data)
temp = temp. next
def inOrder(root, vec):
if (root is None ):
return
inOrder(root.left, vec)
vec.append(root.data)
inOrder(root.right, vec)
def sortedList(root):
vec = []
inOrder(root, vec)
vec.sort()
head = LNode( - 1 )
temp = head
for i in vec:
temp. next = LNode(i)
temp = temp. next
head = head. next
return head
root = TNode( 10 )
root.left = TNode( 15 )
root.right = TNode( 2 )
root.left.left = TNode( 1 )
root.left.right = TNode( 5 )
head = sortedList(root)
printList(head)
|
C#
using System;
using System.Collections.Generic;
public class LNode{
public int data;
public LNode next;
public LNode( int item){
data = item;
next = null ;
}
}
public class TNode{
public int data;
public TNode left, right;
public TNode( int item){
data = item;
left = right = null ;
}
}
class GFG{
static void printList(LNode head){
if (head == null ) return ;
LNode temp = head;
while (temp != null ){
Console.Write(temp.data + " " );
temp = temp.next;
}
}
static void inOrder(TNode root, List< int > vec){
if (root == null ) return ;
inOrder(root.left, vec);
vec.Add(root.data);
inOrder(root.right, vec);
}
static LNode sortedList(TNode root){
List< int > vec = new List< int >();
inOrder(root, vec);
vec.Sort();
LNode head = new LNode(-1);
LNode temp = head;
for ( int i = 0; i<vec.Count; i++){
temp.next = new LNode(vec[i]);
temp = temp.next;
}
head = head.next;
return head;
}
public static void Main(String[] args){
TNode root = new TNode(10);
root.left = new TNode(15);
root.right = new TNode(2);
root.left.left = new TNode(1);
root.left.right = new TNode(5);
LNode head = sortedList(root);
printList(head);
}
}
|
Javascript
class LNode{
constructor(data){
this .data = data;
this .next = null ;
}
}
class TNode{
constructor(data){
this .data = data;
this .left = null ;
this .right = null ;
}
}
function printList(head){
if (head == null ) return ;
let temp = head;
while (temp != null ){
console.log(temp.data + " " );
temp = temp.next;
}
console.log( " " );
}
function inOrder(root, vec){
if (root == null ) return ;
inOrder(root.left, vec);
vec.push(root.data);
inOrder(root.right, vec);
}
function sortedList(root){
let vec = [];
inOrder(root, vec);
vec.sort( function (a,b){ return a-b});
let head = new LNode(-1);
let temp = head;
for (let i = 0; i<vec.length; i++){
temp.next = new LNode(vec[i]);
temp = temp.next;
}
head = head.next;
return head;
}
let root = new TNode(10);
root.left = new TNode(15);
root.right = new TNode(2);
root.left.left = new TNode(1);
root.left.right = new TNode(5);
let head = sortedList(root);
printList(head);
|
Time Complexity: O(N) where N is the number of nodes in given binary tree.
Auxiliary Space: O(N) due to extra space.