1
1
package com .thealgorithms .datastructures .trees ;
2
2
3
3
import com .thealgorithms .datastructures .trees .BinaryTree .Node ;
4
+
4
5
import java .util .HashMap ;
5
6
import java .util .Map ;
6
7
11
12
* subtree. Based on that index create left and right subtree. Complexity: Time:
12
13
* O(n^2) for each node there is iteration to find index in inorder array Space:
13
14
* Stack size = O(height) = O(lg(n))
14
- *
15
+ * <p>
15
16
* Optimized Solution: Instead of iterating over inorder array to find index of
16
17
* root value, create a hashmap and find out the index of root value.
17
18
* Complexity: Time: O(n) hashmap reduced iteration to find index in inorder
18
19
* array Space: O(n) space taken by hashmap
19
- *
20
20
*/
21
21
public 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 );
32
27
}
33
28
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 <>();
53
34
for (int i = 0 ; i < inorder .length ; i ++) {
54
- map .put (inorder [i ], i );
35
+ inorderMap .put (inorder [i ], i );
55
36
}
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 );
66
38
}
67
39
68
40
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
74
46
) {
75
47
if (size == 0 ) {
76
48
return null ;
77
49
}
78
50
79
51
Node root = new Node (preorder [preStart ]);
80
52
int i = inStart ;
81
- while (preorder [preStart ] != inorder [i ]) {
53
+ while (! preorder [preStart ]. equals ( inorder [i ]) ) {
82
54
i ++;
83
55
}
84
56
int leftNodesCount = i - inStart ;
85
57
int rightNodesCount = size - leftNodesCount - 1 ;
86
58
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
+ );
94
66
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
+ );
102
74
return root ;
103
75
}
104
76
105
77
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
112
83
) {
113
84
if (size == 0 ) {
114
85
return null ;
@@ -119,23 +90,21 @@ private static Node createTreeOptimized(
119
90
int leftNodesCount = i - inStart ;
120
91
int rightNodesCount = size - leftNodesCount - 1 ;
121
92
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
+ );
130
100
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
+ );
139
108
return root ;
140
109
}
141
110
}
0 commit comments