package me.ramswaroop.linkedlists; import me.ramswaroop.common.DoubleLinkedList; import me.ramswaroop.common.DoubleLinkedNode; /** * Created by IntelliJ IDEA. * * @author: ramswaroop * @date: 7/24/15 * @time: 3:16 PM */ public class SortedDLLToBBST { /** * Returns the number of nodes in the doubly linked list. * * @param node * @param <E> * @return */ static <E extends Comparable<E>> int getLength(DoubleLinkedNode<E> node) { int l = 0; DoubleLinkedNode<E> curr = node; while (curr != null) { curr = curr.next; l++; } return l; } /** * * @param node * @param <E> */ static <E extends Comparable<E>> void inOrder(DoubleLinkedNode<E> node) { if (node == null) return; inOrder(node.prev); System.out.print(node.item.toString()); inOrder(node.next); } /** * Converts a sorted doubly linked list to a balanced binary tree in-place. * * @param node * @param <E> * @return */ public static <E extends Comparable<E>> DoubleLinkedNode<E> sortedDLLToBBST(DoubleLinkedNode<E> node) { return sortedDLLToBBST(node, getLength(node)); } public static <E extends Comparable<E>> DoubleLinkedNode<E> sortedDLLToBBST(DoubleLinkedNode<E> node, int n) { if (n <= 0) { return null; } DoubleLinkedNode<E> left = sortedDLLToBBST(node, n / 2); DoubleLinkedNode<E> root = node; root.prev = left; node = node.next; DoubleLinkedNode<E> right = sortedDLLToBBST(node, n - n / 2 - 1); root.next = right; return root; } public static void main(String a[]) { DoubleLinkedList<Integer> linkedList = new DoubleLinkedList<>(); linkedList.add(11); linkedList.add(22); linkedList.add(33); linkedList.add(44); linkedList.add(55); linkedList.add(66); linkedList.add(77); linkedList.printList(); inOrder(sortedDLLToBBST(linkedList.head)); System.out.println(); linkedList.printList(); } }