@@ -65,22 +65,309 @@ bSTIterator.prev(); // 状态变为 [3, 7, <u>9</u>, 15, 20], 返回
65
65
66
66
<!-- 这里可写通用的实现逻辑 -->
67
67
68
+ ** 方法一:中序遍历 + 数组**
69
+
70
+ 我们可以使用中序遍历将二叉搜索树的所有节点的值存储到数组 $nums$ 中,然后使用数组实现迭代器。我们定义一个指针 $i$,初始时 $i = -1$,表示指向数组 $nums$ 中的一个元素。每次调用 $next()$ 时,我们将 $i$ 的值加 $1$,并返回 $nums[ i] $;每次调用 $prev()$ 时,我们将 $i$ 的值减 $1$,并返回 $nums[ i] $。
71
+
72
+ 时间复杂度方面,初始化迭代器需要 $O(n)$ 的时间,其中 $n$ 是二叉搜索树的节点数。每次调用 $next()$ 和 $prev()$ 都需要 $O(1)$ 的时间。空间复杂度方面,我们需要 $O(n)$ 的空间存储二叉搜索树的所有节点的值。
73
+
68
74
<!-- tabs:start -->
69
75
70
76
### ** Python3**
71
77
72
78
<!-- 这里可写当前语言的特殊实现逻辑 -->
73
79
74
80
``` python
81
+ # Definition for a binary tree node.
82
+ # class TreeNode:
83
+ # def __init__(self, val=0, left=None, right=None):
84
+ # self.val = val
85
+ # self.left = left
86
+ # self.right = right
87
+ class BSTIterator :
88
+ def __init__ (self , root : Optional[TreeNode]):
89
+ self .nums = []
90
+
91
+ def dfs (root ):
92
+ if root is None :
93
+ return
94
+ dfs(root.left)
95
+ self .nums.append(root.val)
96
+ dfs(root.right)
97
+
98
+ dfs(root)
99
+ self .i = - 1
100
+
101
+ def hasNext (self ) -> bool :
102
+ return self .i < len (self .nums) - 1
75
103
104
+ def next (self ) -> int :
105
+ self .i += 1
106
+ return self .nums[self .i]
107
+
108
+ def hasPrev (self ) -> bool :
109
+ return self .i > 0
110
+
111
+ def prev (self ) -> int :
112
+ self .i -= 1
113
+ return self .nums[self .i]
114
+
115
+
116
+ # Your BSTIterator object will be instantiated and called as such:
117
+ # obj = BSTIterator(root)
118
+ # param_1 = obj.hasNext()
119
+ # param_2 = obj.next()
120
+ # param_3 = obj.hasPrev()
121
+ # param_4 = obj.prev()
76
122
```
77
123
78
124
### ** Java**
79
125
80
126
<!-- 这里可写当前语言的特殊实现逻辑 -->
81
127
82
128
``` java
129
+ /**
130
+ * Definition for a binary tree node.
131
+ * public class TreeNode {
132
+ * int val;
133
+ * TreeNode left;
134
+ * TreeNode right;
135
+ * TreeNode() {}
136
+ * TreeNode(int val) { this.val = val; }
137
+ * TreeNode(int val, TreeNode left, TreeNode right) {
138
+ * this.val = val;
139
+ * this.left = left;
140
+ * this.right = right;
141
+ * }
142
+ * }
143
+ */
144
+ class BSTIterator {
145
+ private List<Integer > nums = new ArrayList<> ();
146
+ private int i = - 1 ;
147
+
148
+ public BSTIterator (TreeNode root ) {
149
+ dfs(root);
150
+ }
151
+
152
+ public boolean hasNext () {
153
+ return i < nums. size() - 1 ;
154
+ }
155
+
156
+ public int next () {
157
+ return nums. get(++ i);
158
+ }
159
+
160
+ public boolean hasPrev () {
161
+ return i > 0 ;
162
+ }
163
+
164
+ public int prev () {
165
+ return nums. get(-- i);
166
+ }
167
+
168
+ private void dfs (TreeNode root ) {
169
+ if (root == null ) {
170
+ return ;
171
+ }
172
+ dfs(root. left);
173
+ nums. add(root. val);
174
+ dfs(root. right);
175
+ }
176
+ }
177
+
178
+ /**
179
+ * Your BSTIterator object will be instantiated and called as such:
180
+ * BSTIterator obj = new BSTIterator(root);
181
+ * boolean param_1 = obj.hasNext();
182
+ * int param_2 = obj.next();
183
+ * boolean param_3 = obj.hasPrev();
184
+ * int param_4 = obj.prev();
185
+ */
186
+ ```
187
+
188
+ ### ** C++**
189
+
190
+ ``` cpp
191
+ /* *
192
+ * Definition for a binary tree node.
193
+ * struct TreeNode {
194
+ * int val;
195
+ * TreeNode *left;
196
+ * TreeNode *right;
197
+ * TreeNode() : val(0), left(nullptr), right(nullptr) {}
198
+ * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
199
+ * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
200
+ * };
201
+ */
202
+ class BSTIterator {
203
+ public:
204
+ BSTIterator(TreeNode* root) {
205
+ dfs(root);
206
+ n = nums.size();
207
+ }
208
+
209
+ bool hasNext() {
210
+ return i < n - 1;
211
+ }
212
+
213
+ int next () {
214
+ return nums[++i];
215
+ }
216
+
217
+ bool hasPrev() {
218
+ return i > 0;
219
+ }
220
+
221
+ int prev() {
222
+ return nums[--i];
223
+ }
224
+
225
+ private:
226
+ vector<int > nums;
227
+ int i = -1;
228
+ int n;
229
+
230
+ void dfs(TreeNode* root) {
231
+ if (!root) {
232
+ return;
233
+ }
234
+ dfs (root->left);
235
+ nums.push_back(root->val);
236
+ dfs(root->right);
237
+ }
238
+ };
239
+
240
+ /* *
241
+ * Your BSTIterator object will be instantiated and called as such:
242
+ * BSTIterator* obj = new BSTIterator(root);
243
+ * bool param_1 = obj->hasNext();
244
+ * int param_2 = obj->next();
245
+ * bool param_3 = obj->hasPrev();
246
+ * int param_4 = obj->prev();
247
+ */
248
+ ```
249
+
250
+ ### ** Go**
251
+
252
+ ``` go
253
+ /* *
254
+ * Definition for a binary tree node.
255
+ * type TreeNode struct {
256
+ * Val int
257
+ * Left *TreeNode
258
+ * Right *TreeNode
259
+ * }
260
+ */
261
+ type BSTIterator struct {
262
+ nums []int
263
+ i, n int
264
+ }
265
+
266
+ func Constructor (root *TreeNode ) BSTIterator {
267
+ nums := []int {}
268
+ var dfs func (*TreeNode)
269
+ dfs = func (root *TreeNode) {
270
+ if root == nil {
271
+ return
272
+ }
273
+ dfs (root.Left )
274
+ nums = append (nums, root.Val )
275
+ dfs (root.Right )
276
+ }
277
+ dfs (root)
278
+ return BSTIterator{nums, -1 , len (nums)}
279
+ }
280
+
281
+ func (this *BSTIterator ) HasNext () bool {
282
+ return this.i < this.n -1
283
+ }
284
+
285
+ func (this *BSTIterator ) Next () int {
286
+ this.i ++
287
+ return this.nums [this.i ]
288
+ }
289
+
290
+ func (this *BSTIterator ) HasPrev () bool {
291
+ return this.i > 0
292
+ }
293
+
294
+ func (this *BSTIterator ) Prev () int {
295
+ this.i --
296
+ return this.nums [this.i ]
297
+ }
298
+
299
+ /* *
300
+ * Your BSTIterator object will be instantiated and called as such:
301
+ * obj := Constructor(root);
302
+ * param_1 := obj.HasNext();
303
+ * param_2 := obj.Next();
304
+ * param_3 := obj.HasPrev();
305
+ * param_4 := obj.Prev();
306
+ */
307
+ ```
308
+
309
+ ### ** TypeScript**
310
+
311
+ ``` ts
312
+ /**
313
+ * Definition for a binary tree node.
314
+ * class TreeNode {
315
+ * val: number
316
+ * left: TreeNode | null
317
+ * right: TreeNode | null
318
+ * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
319
+ * this.val = (val===undefined ? 0 : val)
320
+ * this.left = (left===undefined ? null : left)
321
+ * this.right = (right===undefined ? null : right)
322
+ * }
323
+ * }
324
+ */
325
+
326
+ class BSTIterator {
327
+ private nums: number [];
328
+ private n: number ;
329
+ private i: number ;
330
+
331
+ constructor (root : TreeNode | null ) {
332
+ this .nums = [];
333
+ const dfs = (root : TreeNode | null ) => {
334
+ if (! root ) {
335
+ return ;
336
+ }
337
+ dfs (root .left );
338
+ this .nums .push (root .val );
339
+ dfs (root .right );
340
+ };
341
+ dfs (root );
342
+ this .n = this .nums .length ;
343
+ this .i = - 1 ;
344
+ }
345
+
346
+ hasNext(): boolean {
347
+ return this .i < this .n - 1 ;
348
+ }
349
+
350
+ next(): number {
351
+ return this .nums [++ this .i ];
352
+ }
353
+
354
+ hasPrev(): boolean {
355
+ return this .i > 0 ;
356
+ }
357
+
358
+ prev(): number {
359
+ return this .nums [-- this .i ];
360
+ }
361
+ }
83
362
363
+ /**
364
+ * Your BSTIterator object will be instantiated and called as such:
365
+ * var obj = new BSTIterator(root)
366
+ * var param_1 = obj.hasNext()
367
+ * var param_2 = obj.next()
368
+ * var param_3 = obj.hasPrev()
369
+ * var param_4 = obj.prev()
370
+ */
84
371
```
85
372
86
373
### ** ...**
0 commit comments