Convert sorted Linked List to balanced BST

If you want to practice data structure and algorithm programs, you can go through 100+ java coding interview questions.

In this post , we will see how to convert sorted LinkedList to balanced binary search tree.
There are two ways to do it.

Solution 1:

It is very much similar to convert sorted array to BST. Find middle element of linked list and make it root and do it recursively.
Time complexity : o(nlogn).

Solution 2:

This solution will follow bottom up approach rather than top down.

  • We need to find length of linked list
  • We will first create left subtree recursively using n/2 nodes.
  • We will create root node and connect left subtree to the root node.
  • Similarly create right subtree recursively and connect root to right subtree.

Java Program to convert sorted LinkedList to balanced BST:

package org.arpit.java2blog;

import org.arpit.java2blog.BinarySearchTreeMain.TreeNode;

public class SortedLinkedListToBSTMain {

 private Node head;

 private static class Node {
 private int value;
 private Node next;

 Node(int value) {
 this.value = value;

 }
 }

 public static class TreeNode {
 int data;
 TreeNode left;
 TreeNode right;

 TreeNode(int data) {
 this.data = data;
 }
 }

 public static void preOrder(TreeNode root) {
 if (root == null)
 return;
 System.out.print(root.data + " ");
 preOrder(root.left);
 preOrder(root.right);
 }

 public void addToTheLast(Node node) {

 if (head == null) {
 head = node;
 } else {
 Node temp = head;
 while (temp.next != null)
 temp = temp.next;

 temp.next = node;
 }
 }

 public void printList(Node head) {
 Node temp = head;
 while (temp != null) {
 System.out.format("%d ", temp.value);
 temp = temp.next;
 }
 System.out.println();
 }

 // Find length of linked list using iterative method
 public int lengthOfLinkedList()
 {
 Node temp=head;
 int count = 0;
 while(temp!=null)
 {
 temp=temp.next;
 count++; 
 }
 return count;
 }

 public TreeNode convertSortedLinkedListToBST(int n)
 {
 /* Base Case for recursion*/
 if (n <= 0) 
 return null;

 /* Recursively creating the left subtree */
 TreeNode left = convertSortedLinkedListToBST(n / 2);

 /* Create a root node*/
 TreeNode root = new TreeNode(head.value);

 // Set pointer to left subtree
 root.left = left;
 head = head.next;
 /* Create right subtree with remaining nodes*/
 root.right = convertSortedLinkedListToBST(n - n / 2 - 1);

 return root;
 }
 public static void main(String[] args) {
 SortedLinkedListToBSTMain list = new SortedLinkedListToBSTMain();
 // Creating a linked list
 Node head = new Node(10);
 list.addToTheLast(head);
 list.addToTheLast(new Node(20));
 list.addToTheLast(new Node(30));
 list.addToTheLast(new Node(40));
 list.addToTheLast(new Node(50));
 list.addToTheLast(new Node(60));
 list.addToTheLast(new Node(70));
 list.addToTheLast(new Node(80));
 list.addToTheLast(new Node(90));
 System.out.println("Printing linked list :");
 list.printList(head);
 int n =list.lengthOfLinkedList();

 TreeNode bst=list.convertSortedLinkedListToBST(n);
 System.out.println("---------------");
 System.out.println("Pre order traversal of binary search tree :");
 preOrder(bst);

 }

}

When you run above program, you will get below output:

Printing linked list :
10 20 30 40 50 60 70 80 90 
---------------
Pre order traversal of binary search tree :
50 30 20 10 40 80 70 60 90

Time complexity : o(N).

[social_share share_on="facebook,twitter,linkedin,whatsapp"][post_navigator in_same_term="true"]

Leave a Reply

Your email address will not be published. Required fields are marked *

Subscribe to our newletter

Get quality tutorials to your inbox. Subscribe now.