11package com .thealgorithms .datastructures .trees ;
22
33import com .thealgorithms .datastructures .trees .BinaryTree .Node ;
4+
45import java .util .HashMap ;
56import java .util .Map ;
67
1112 * subtree. Based on that index create left and right subtree. Complexity: Time:
1213 * O(n^2) for each node there is iteration to find index in inorder array Space:
1314 * Stack size = O(height) = O(lg(n))
14- *
15+ * <p>
1516 * Optimized Solution: Instead of iterating over inorder array to find index of
1617 * root value, create a hashmap and find out the index of root value.
1718 * Complexity: Time: O(n) hashmap reduced iteration to find index in inorder
1819 * array Space: O(n) space taken by hashmap
19- *
2020 */
2121public class CreateBinaryTreeFromInorderPreorder {
22-
23- public static void main (String [] args ) {
24- test (new Integer [] {}, new Integer [] {}); // empty tree
25- test (new Integer [] { 1 }, new Integer [] { 1 }); // single node tree
26- test (new Integer [] { 1 , 2 , 3 , 4 }, new Integer [] { 1 , 2 , 3 , 4 }); // right skewed tree
27- test (new Integer [] { 1 , 2 , 3 , 4 }, new Integer [] { 4 , 3 , 2 , 1 }); // left skewed tree
28- test (
29- new Integer [] { 3 , 9 , 20 , 15 , 7 },
30- new Integer [] { 9 , 3 , 15 , 20 , 7 }
31- ); // normal tree
22+ public static Node createTree (final Integer [] preorder , final Integer [] inorder ) {
23+ if (preorder == null || inorder == null ) {
24+ return null ;
25+ }
26+ return createTree (preorder , inorder , 0 , 0 , inorder .length );
3227 }
3328
34- private static void test (
35- final Integer [] preorder ,
36- final Integer [] inorder
37- ) {
38- System .out .println (
39- "\n ===================================================="
40- );
41- System .out .println ("Naive Solution..." );
42- BinaryTree root = new BinaryTree (
43- createTree (preorder , inorder , 0 , 0 , inorder .length )
44- );
45- System .out .println ("Preorder Traversal: " );
46- root .preOrder (root .getRoot ());
47- System .out .println ("\n Inorder Traversal: " );
48- root .inOrder (root .getRoot ());
49- System .out .println ("\n PostOrder Traversal: " );
50- root .postOrder (root .getRoot ());
51-
52- Map <Integer , Integer > map = new HashMap <>();
29+ public static Node createTreeOptimized (final Integer [] preorder , final Integer [] inorder ) {
30+ if (preorder == null || inorder == null ) {
31+ return null ;
32+ }
33+ Map <Integer , Integer > inorderMap = new HashMap <>();
5334 for (int i = 0 ; i < inorder .length ; i ++) {
54- map .put (inorder [i ], i );
35+ inorderMap .put (inorder [i ], i );
5536 }
56- BinaryTree optimizedRoot = new BinaryTree (
57- createTreeOptimized (preorder , inorder , 0 , 0 , inorder .length , map )
58- );
59- System .out .println ("\n \n Optimized solution..." );
60- System .out .println ("Preorder Traversal: " );
61- optimizedRoot .preOrder (root .getRoot ());
62- System .out .println ("\n Inorder Traversal: " );
63- optimizedRoot .inOrder (root .getRoot ());
64- System .out .println ("\n PostOrder Traversal: " );
65- optimizedRoot .postOrder (root .getRoot ());
37+ return createTreeOptimized (preorder , inorderMap , 0 , 0 , inorder .length );
6638 }
6739
6840 private static Node createTree (
69- final Integer [] preorder ,
70- final Integer [] inorder ,
71- final int preStart ,
72- final int inStart ,
73- final int size
41+ final Integer [] preorder ,
42+ final Integer [] inorder ,
43+ final int preStart ,
44+ final int inStart ,
45+ final int size
7446 ) {
7547 if (size == 0 ) {
7648 return null ;
7749 }
7850
7951 Node root = new Node (preorder [preStart ]);
8052 int i = inStart ;
81- while (preorder [preStart ] != inorder [i ]) {
53+ while (! preorder [preStart ]. equals ( inorder [i ]) ) {
8254 i ++;
8355 }
8456 int leftNodesCount = i - inStart ;
8557 int rightNodesCount = size - leftNodesCount - 1 ;
8658 root .left =
87- createTree (
88- preorder ,
89- inorder ,
90- preStart + 1 ,
91- inStart ,
92- leftNodesCount
93- );
59+ createTree (
60+ preorder ,
61+ inorder ,
62+ preStart + 1 ,
63+ inStart ,
64+ leftNodesCount
65+ );
9466 root .right =
95- createTree (
96- preorder ,
97- inorder ,
98- preStart + leftNodesCount + 1 ,
99- i + 1 ,
100- rightNodesCount
101- );
67+ createTree (
68+ preorder ,
69+ inorder ,
70+ preStart + leftNodesCount + 1 ,
71+ i + 1 ,
72+ rightNodesCount
73+ );
10274 return root ;
10375 }
10476
10577 private static Node createTreeOptimized (
106- final Integer [] preorder ,
107- final Integer [] inorder ,
108- final int preStart ,
109- final int inStart ,
110- final int size ,
111- final Map <Integer , Integer > inorderMap
78+ final Integer [] preorder ,
79+ final Map <Integer , Integer > inorderMap ,
80+ final int preStart ,
81+ final int inStart ,
82+ final int size
11283 ) {
11384 if (size == 0 ) {
11485 return null ;
@@ -119,23 +90,21 @@ private static Node createTreeOptimized(
11990 int leftNodesCount = i - inStart ;
12091 int rightNodesCount = size - leftNodesCount - 1 ;
12192 root .left =
122- createTreeOptimized (
123- preorder ,
124- inorder ,
125- preStart + 1 ,
126- inStart ,
127- leftNodesCount ,
128- inorderMap
129- );
93+ createTreeOptimized (
94+ preorder ,
95+ inorderMap ,
96+ preStart + 1 ,
97+ inStart ,
98+ leftNodesCount
99+ );
130100 root .right =
131- createTreeOptimized (
132- preorder ,
133- inorder ,
134- preStart + leftNodesCount + 1 ,
135- i + 1 ,
136- rightNodesCount ,
137- inorderMap
138- );
101+ createTreeOptimized (
102+ preorder ,
103+ inorderMap ,
104+ preStart + leftNodesCount + 1 ,
105+ i + 1 ,
106+ rightNodesCount
107+ );
139108 return root ;
140109 }
141110}
0 commit comments