Skip to content

Commit b02a3fc

Browse files
Create a binary tree from inorder and preorder traversal given in array form (Fixes: TheAlgorithms#2707) (TheAlgorithms#2710)
Co-authored-by: Amit Kumar <[email protected]>
1 parent ec127df commit b02a3fc

File tree

2 files changed

+101
-1
lines changed

2 files changed

+101
-1
lines changed

DataStructures/Trees/BinaryTree.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class BinaryTree {
2222
*
2323
* @author Unknown
2424
*/
25-
class Node {
25+
static class Node {
2626
/** Data for the node */
2727
public int data;
2828
/** The Node to the left of this one */
@@ -53,6 +53,11 @@ public BinaryTree() {
5353
root = null;
5454
}
5555

56+
/** Parameterized Constructor */
57+
public BinaryTree(Node root) {
58+
this.root = root;
59+
}
60+
5661
/**
5762
* Method to find a Node with a certain value
5863
*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package DataStructures.Trees;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import DataStructures.Trees.BinaryTree.Node;
6+
7+
/**
8+
* Approach: Naive Solution: Create root node from first value present in
9+
* preorder traversal. Look for the index of root node's value in inorder
10+
* traversal. That will tell total nodes present in left subtree and right
11+
* subtree. Based on that index create left and right subtree.
12+
* Complexity:
13+
* Time: O(n^2) for each node there is iteration to find index in inorder array
14+
* Space: Stack size = O(height) = O(lg(n))
15+
*
16+
* Optimized Solution: Instead of iterating over inorder array to find index of
17+
* root value, create a hashmap and find out the index of root value.
18+
* Complexity:
19+
* Time: O(n) hashmap reduced iteration to find index in inorder array
20+
* Space: O(n) space taken by hashmap
21+
*
22+
*/
23+
public class CreateBinaryTreeFromInorderPreorder {
24+
public static void main(String[] args) {
25+
test(new Integer[] {}, new Integer[] {}); // empty tree
26+
test(new Integer[] { 1 }, new Integer[] { 1 }); // single node tree
27+
test(new Integer[] { 1, 2, 3, 4 }, new Integer[] { 1, 2, 3, 4 }); // right skewed tree
28+
test(new Integer[] { 1, 2, 3, 4 }, new Integer[] { 4, 3, 2, 1 }); // left skewed tree
29+
test(new Integer[] { 3, 9, 20, 15, 7 }, new Integer[] { 9, 3, 15, 20, 7 }); // normal tree
30+
}
31+
32+
private static void test(final Integer[] preorder, final Integer[] inorder) {
33+
System.out.println("\n====================================================");
34+
System.out.println("Naive Solution...");
35+
BinaryTree root = new BinaryTree(createTree(preorder, inorder, 0, 0, inorder.length));
36+
System.out.println("Preorder Traversal: ");
37+
root.preOrder(root.getRoot());
38+
System.out.println("\nInorder Traversal: ");
39+
root.inOrder(root.getRoot());
40+
System.out.println("\nPostOrder Traversal: ");
41+
root.postOrder(root.getRoot());
42+
43+
Map<Integer, Integer> map = new HashMap<>();
44+
for (int i = 0; i < inorder.length; i++) {
45+
map.put(inorder[i], i);
46+
}
47+
BinaryTree optimizedRoot = new BinaryTree(createTreeOptimized(preorder, inorder, 0, 0, inorder.length, map));
48+
System.out.println("\n\nOptimized solution...");
49+
System.out.println("Preorder Traversal: ");
50+
optimizedRoot.preOrder(root.getRoot());
51+
System.out.println("\nInorder Traversal: ");
52+
optimizedRoot.inOrder(root.getRoot());
53+
System.out.println("\nPostOrder Traversal: ");
54+
optimizedRoot.postOrder(root.getRoot());
55+
}
56+
57+
private static Node createTree(final Integer[] preorder, final Integer[] inorder,
58+
final int preStart, final int inStart, final int size) {
59+
if (size == 0) {
60+
return null;
61+
}
62+
63+
Node root = new Node(preorder[preStart]);
64+
int i = inStart;
65+
while (preorder[preStart] != inorder[i]) {
66+
i++;
67+
}
68+
int leftNodesCount = i - inStart;
69+
int rightNodesCount = size - leftNodesCount - 1;
70+
root.left = createTree(preorder, inorder, preStart + 1, inStart, leftNodesCount);
71+
root.right = createTree(preorder, inorder, preStart + leftNodesCount + 1, i + 1,
72+
rightNodesCount);
73+
return root;
74+
75+
}
76+
77+
private static Node createTreeOptimized(final Integer[] preorder, final Integer[] inorder,
78+
final int preStart, final int inStart, final int size,
79+
final Map<Integer, Integer> inorderMap) {
80+
if (size == 0) {
81+
return null;
82+
}
83+
84+
Node root = new Node(preorder[preStart]);
85+
int i = inorderMap.get(preorder[preStart]);
86+
int leftNodesCount = i - inStart;
87+
int rightNodesCount = size - leftNodesCount - 1;
88+
root.left = createTreeOptimized(preorder, inorder, preStart + 1, inStart,
89+
leftNodesCount, inorderMap);
90+
root.right = createTreeOptimized(preorder, inorder, preStart + leftNodesCount + 1,
91+
i + 1, rightNodesCount, inorderMap);
92+
return root;
93+
}
94+
95+
}

0 commit comments

Comments
 (0)