package com.interview.tree; /** * Date 03/16/2015 * @author tusroy * * Given a binary tree(not BST) convert it into sorted linklist. * e.g 10 * 11 15 * 8 9 16 13 * 7 * * should become 7->8->9->10->11->13->15->16 * * Solution * Idea is that at every root, get the sorted linklist from left and right and merge them * along with root and return left most element in this merged linklist to upper level call. * * Test cases * 1) Null root * 2) One node root * 3) BST * 4) Reverse BST * 5) All on left side of root * * Reference * http://www.careercup.com/question?id=6241652616200192 * */ public class DegenerateBinaryTreeToSortedLL { public Node degenerate(Node root){ if(root == null){ return null; } Node left = root.left; Node right = root.right; root.left = null; root.right = null; left = degenerate(left); right = degenerate(right); left = merge(left, root); return merge(left, right); } private Node merge(Node root1, Node root2){ if(root1 == null){ return root2; } if(root2 == null){ return root1; } if(root1.data <= root2.data){ root1.right = merge(root1.right, root2); return root1; }else{ root2.right = merge(root1, root2.right); return root2; } } private void printList(Node root){ while(root != null){ System.out.print(root.data + " "); root = root.right; } } public static void main(String args[]){ ConstructTreeFromInOrderPreOrder ctf = new ConstructTreeFromInOrderPreOrder(); int inorder[] = {8, 11, 9, 10, 16, 15, 13, 7}; int preorder[] = {10, 11, 8, 9, 15, 16, 13, 7}; Node root = ctf.createTree(inorder, preorder); DegenerateBinaryTreeToSortedLL dbt = new DegenerateBinaryTreeToSortedLL(); root = dbt.degenerate(root); dbt.printList(root); } }