@@ -58,34 +58,29 @@ public TreeNode(int weight, String str) {
58
58
}
59
59
60
60
public int calculate (String s ) {
61
- // check edge case
62
- if (s == null || s .length () == 0 ) {
63
- return 0 ;
64
- }
65
- // build expression tree
66
- TreeNode root = buildTree (s );
67
- // post-order traversal of the tree
68
-
69
- return (int )evaluate (root );
61
+ if (s == null || s .length () == 0 ) return 0 ;
62
+ TreeNode root = buildTree (s ); // build expression tree
63
+ return (int )evaluate (root ); // post-order traversal of the tree
70
64
}
71
65
72
66
// build tree based on input string, min-tree. return root
73
67
private TreeNode buildTree (String s ) {
68
+ int n = s .length ();
74
69
char [] chars = s .trim ().toCharArray ();
75
70
Stack <TreeNode > stack = new Stack <>();
76
71
int base = 0 ;
77
72
StringBuffer sb = new StringBuffer ();
78
- for (int i = 0 ; i < chars . length ; i ++) {
73
+ for (int i = 0 ; i < n ; i ++) {
79
74
char c = chars [i ];
80
75
if (c == ' ' ) {
81
76
continue ;
82
- } else if (c == '(' ) {
77
+ } else if (c == '(' ) { // '()' are used to add weight, not stored in tree
83
78
base = getWeight (base , c );
84
79
continue ;
85
80
} else if (c == ')' ) {
86
81
base = getWeight (base , c );
87
82
continue ;
88
- } else if (i < chars . length - 1 && isDigit (chars [i ]) && isDigit (chars [i + 1 ])) {
83
+ } else if (i < n - 1 && isDigit (chars [i ]) && isDigit (chars [i + 1 ])) { // continue to get remaining of the int
89
84
sb .append (c );
90
85
continue ;
91
86
}
@@ -113,14 +108,12 @@ private TreeNode buildTree(String s) {
113
108
root = stack .pop ();
114
109
}
115
110
116
- return root ; // it's the root of tree
111
+ return root ; // it's the root of tree, always a operator
117
112
}
118
113
119
114
// post-order traversal to evaluate the expression
120
115
private long evaluate (TreeNode root ) {
121
- if (root == null ) {
122
- return 0 ;
123
- }
116
+ if (root == null ) return 0 ;
124
117
long left = evaluate (root .left );
125
118
long right = evaluate (root .right );
126
119
long result = 0 ;
@@ -146,26 +139,16 @@ private long evaluate(TreeNode root) {
146
139
// get weight of the character. integer weights the most and will be leaf.
147
140
// Remember to store the result using long
148
141
private int getWeight (int base , char c ) {
149
- if (c == '(' ) {
150
- return base + 10 ;
151
- }
152
- if (c == ')' ) {
153
- return base - 10 ;
154
- }
155
- if (c == '+' || c == '-' ) {
156
- return base + 1 ;
157
- }
158
- if (c == '*' || c == '/' ) {
159
- return base + 2 ;
160
- }
142
+ if (c == '(' ) return base + 10 ;
143
+ if (c == ')' ) return base - 10 ;
144
+ if (c == '+' || c == '-' ) return base + 1 ;
145
+ if (c == '*' || c == '/' ) return base + 2 ;
161
146
return Integer .MAX_VALUE ;
162
147
}
163
148
164
149
private boolean isDigit (char c ) {
165
150
return c >= '0' && c <= '9' ;
166
151
}
167
-
168
-
169
152
}
170
153
171
- ```
154
+ ```
0 commit comments