package com.interview.tree;
/**
* http://www.geeksforgeeks.org/construct-tree-inorder-level-order-traversals/
* Test cases
* same length of inorder and level order array
* all elements should be same in them
* what to do if repetition happens. This logic only works for non repeated values
* if inorder and levelorder were represented by string how would you handle multi digits
* e.g 1234 we don't know if it is 12 34 or 1 2 3 4 or what. Maybe use brackets
* (12)(3)(4) to differentiate between them.
*/
public class ConstructTreeFromLevelOrderInOrder {
public Node constructTree(int inOrder[], int levelOrder[]){
return constructTree(inOrder, levelOrder,0,inOrder.length-1);
}
private int[] extractArray(int inOrder[], int levelOrder[],int low, int high){
int result[] = new int[high - low + 1];
int p=0;
for(int i=1; i < levelOrder.length; i++){
int index = search(inOrder,levelOrder[i],low,high);
if(index != -1){
result[p++] = inOrder[index];
}
}
return result;
}
private Node constructTree(int inOrder[], int levelOrder[], int low, int high){
if(low > high){
return null;
}
int lowElement = levelOrder[0];
Node n = Node.newNode(lowElement);
int index = search(inOrder,lowElement,low,high);
int left[] = extractArray(inOrder,levelOrder,low,index-1);
int right[] = extractArray(inOrder,levelOrder,index+1,high);
n.left = constructTree(inOrder, left, low, index-1);
n.right = constructTree(inOrder, right, index+1, high);
return n;
}
private int search(int input[],int key, int low, int high){
if(low > high){
return -1;
}
int middle = (low + high)/2;
if(input[middle] == key){
return middle;
}else if(input[middle] > key){
return search(input,key,low,middle-1);
}else{
return search(input,key,middle+1,high);
}
}
public static void main(String args[]){
int inOrder[] = {4,8,10,12,14,20,22};
int levelOrder[] = {20,8,22,4,12,10,14};
ConstructTreeFromLevelOrderInOrder ctf = new ConstructTreeFromLevelOrderInOrder();
Node root = ctf.constructTree(inOrder, levelOrder);
LevelOrderTraversal lot = new LevelOrderTraversal();
TreeTraversals tt = new TreeTraversals();
tt.inOrder(root);
lot.levelOrder(root);
}
}