70
70
71
71
非递归的思路如下:
72
72
73
- 1 . 定义一个栈
73
+ 1 . 定义一个栈 stk
74
74
2 . 将树的左节点依次入栈
75
75
3 . 左节点为空时,弹出栈顶元素并处理
76
76
4 . 重复 2-3 的操作
@@ -81,10 +81,10 @@ Morris 遍历无需使用栈,空间复杂度为 O(1)。核心思想是:
81
81
82
82
遍历二叉树节点,
83
83
84
- 1 . 若当前节点 root 的左子树为空,** 将当前节点值添加至结果列表 res ** 中,并将当前节点更新为 ` root.right `
85
- 2 . 若当前节点 root 的左子树不为空,找到左子树的最右节点 pre (也即是 root 节点在中序遍历下的前驱节点):
86
- - 若前驱节点 pre 的右子树为空,将前驱节点的右子树指向当前节点 root,并将当前节点更新为 ` root.left ` 。
87
- - 若前驱节点 pre 的右子树不为空,** 将当前节点值添加至结果列表 res ** 中,然后将前驱节点右子树指向空(即解除 pre 与 root 的指向关系),并将当前节点更新为 ` root.right ` 。
84
+ 1 . 若当前节点 root 的左子树为空,** 将当前节点值添加至结果列表 ans ** 中,并将当前节点更新为 ` root.right `
85
+ 2 . 若当前节点 root 的左子树不为空,找到左子树的最右节点 prev (也即是 root 节点在中序遍历下的前驱节点):
86
+ - 若前驱节点 prev 的右子树为空,将前驱节点的右子树指向当前节点 root,并将当前节点更新为 ` root.left ` 。
87
+ - 若前驱节点 prev 的右子树不为空,** 将当前节点值添加至结果列表 ans ** 中,然后将前驱节点右子树指向空(即解除 prev 与 root 的指向关系),并将当前节点更新为 ` root.right ` 。
88
88
3 . 循环以上步骤,直至二叉树节点为空,遍历结束。
89
89
90
90
<!-- tabs:start -->
@@ -103,17 +103,18 @@ Morris 遍历无需使用栈,空间复杂度为 O(1)。核心思想是:
103
103
# self.left = left
104
104
# self.right = right
105
105
class Solution :
106
- def inorderTraversal (self , root : TreeNode) -> List[int ]:
107
- res = []
108
-
109
- def inorder (root ):
110
- if root:
111
- inorder(root.left)
112
- res.append(root.val)
113
- inorder(root.right)
114
-
115
- inorder(root)
116
- return res
106
+ def inorderTraversal (self , root : Optional[TreeNode]) -> List[int ]:
107
+ def dfs (root ):
108
+ if root is None :
109
+ return
110
+ dfs(root.left)
111
+ nonlocal ans
112
+ ans.append(root.val)
113
+ dfs(root.right)
114
+
115
+ ans = []
116
+ dfs(root)
117
+ return ans
117
118
```
118
119
119
120
栈实现非递归:
@@ -126,17 +127,17 @@ class Solution:
126
127
# self.left = left
127
128
# self.right = right
128
129
class Solution :
129
- def inorderTraversal (self , root : TreeNode) -> List[int ]:
130
- res, s = [], []
131
- while root or s :
130
+ def inorderTraversal (self , root : Optional[ TreeNode] ) -> List[int ]:
131
+ ans, stk = [], []
132
+ while root or stk :
132
133
if root:
133
- s .append(root)
134
+ stk .append(root)
134
135
root = root.left
135
136
else :
136
- root = s .pop()
137
- res .append(root.val)
137
+ root = stk .pop()
138
+ ans .append(root.val)
138
139
root = root.right
139
- return res
140
+ return ans
140
141
```
141
142
142
143
Morris 遍历:
@@ -149,24 +150,24 @@ Morris 遍历:
149
150
# self.left = left
150
151
# self.right = right
151
152
class Solution :
152
- def inorderTraversal (self , root : TreeNode) -> List[int ]:
153
- res = []
153
+ def inorderTraversal (self , root : Optional[ TreeNode] ) -> List[int ]:
154
+ ans = []
154
155
while root:
155
156
if root.left is None :
156
- res .append(root.val)
157
+ ans .append(root.val)
157
158
root = root.right
158
159
else :
159
- pre = root.left
160
- while pre .right and pre .right != root:
161
- pre = pre .right
162
- if pre .right is None :
163
- pre .right = root
160
+ prev = root.left
161
+ while prev .right and prev .right != root:
162
+ prev = prev .right
163
+ if prev .right is None :
164
+ prev .right = root
164
165
root = root.left
165
166
else :
166
- res .append(root.val)
167
- pre .right = None
167
+ ans .append(root.val)
168
+ prev .right = None
168
169
root = root.right
169
- return res
170
+ return ans
170
171
```
171
172
172
173
### ** Java**
@@ -192,18 +193,21 @@ class Solution:
192
193
* }
193
194
*/
194
195
class Solution {
196
+ private List<Integer > ans;
197
+
195
198
public List<Integer > inorderTraversal (TreeNode root ) {
196
- List< Integer > res = new ArrayList<> ();
197
- inorder (root, res );
198
- return res ;
199
+ ans = new ArrayList<> ();
200
+ dfs (root);
201
+ return ans ;
199
202
}
200
203
201
- private void inorder (TreeNode root , List<Integer > res ) {
202
- if (root != null ) {
203
- inorder(root. left, res);
204
- res. add(root. val);
205
- inorder(root. right, res);
204
+ private void dfs (TreeNode root ) {
205
+ if (root == null ) {
206
+ return ;
206
207
}
208
+ dfs(root. left);
209
+ ans. add(root. val);
210
+ dfs(root. right);
207
211
}
208
212
}
209
213
```
@@ -228,19 +232,19 @@ class Solution {
228
232
*/
229
233
class Solution {
230
234
public List<Integer > inorderTraversal (TreeNode root ) {
231
- List<Integer > res = new ArrayList<> ();
232
- Deque<TreeNode > s = new LinkedList <> ();
233
- while (root != null || ! s . isEmpty()) {
235
+ List<Integer > ans = new ArrayList<> ();
236
+ Deque<TreeNode > stk = new ArrayDeque <> ();
237
+ while (root != null || ! stk . isEmpty()) {
234
238
if (root != null ) {
235
- s . offerLast (root);
239
+ stk . push (root);
236
240
root = root. left;
237
241
} else {
238
- root = s . pollLast ();
239
- res . add(root. val);
242
+ root = stk . pop ();
243
+ ans . add(root. val);
240
244
root = root. right;
241
245
}
242
246
}
243
- return res ;
247
+ return ans ;
244
248
}
245
249
}
246
250
```
@@ -265,27 +269,27 @@ Morris 遍历:
265
269
*/
266
270
class Solution {
267
271
public List<Integer > inorderTraversal (TreeNode root ) {
268
- List<Integer > res = new ArrayList<> ();
272
+ List<Integer > ans = new ArrayList<> ();
269
273
while (root != null ) {
270
274
if (root. left == null ) {
271
- res . add(root. val);
275
+ ans . add(root. val);
272
276
root = root. right;
273
277
} else {
274
- TreeNode pre = root. left;
275
- while (pre . right != null && pre . right != root) {
276
- pre = pre . right;
278
+ TreeNode prev = root. left;
279
+ while (prev . right != null && prev . right != root) {
280
+ prev = prev . right;
277
281
}
278
- if (pre . right == null ) {
279
- pre . right = root;
282
+ if (prev . right == null ) {
283
+ prev . right = root;
280
284
root = root. left;
281
285
} else {
282
- res . add(root. val);
283
- pre . right = null ;
286
+ ans . add(root. val);
287
+ prev . right = null ;
284
288
root = root. right;
285
289
}
286
290
}
287
291
}
288
- return res ;
292
+ return ans ;
289
293
}
290
294
}
291
295
```
@@ -308,16 +312,15 @@ class Solution {
308
312
* @return {number[]}
309
313
*/
310
314
var inorderTraversal = function (root ) {
311
- let res = [];
312
- function inorder (root ) {
313
- if (root) {
314
- inorder (root .left );
315
- res .push (root .val );
316
- inorder (root .right );
317
- }
315
+ let ans = [];
316
+ function dfs (root ) {
317
+ if (! root) return ;
318
+ dfs (root .left );
319
+ ans .push (root .val );
320
+ dfs (root .right );
318
321
}
319
- inorder (root);
320
- return res ;
322
+ dfs (root);
323
+ return ans ;
321
324
};
322
325
```
323
326
@@ -337,19 +340,59 @@ var inorderTraversal = function (root) {
337
340
* @return {number[]}
338
341
*/
339
342
var inorderTraversal = function (root ) {
340
- let res = [];
341
- let s = [];
342
- while (root || s .length > 0 ) {
343
+ let ans = [],
344
+ stk = [];
345
+ while (root || stk .length > 0 ) {
343
346
if (root) {
344
- s .push (root);
347
+ stk .push (root);
345
348
root = root .left ;
346
349
} else {
347
- root = s .pop ();
348
- res .push (root .val );
350
+ root = stk .pop ();
351
+ ans .push (root .val );
349
352
root = root .right ;
350
353
}
351
354
}
352
- return res;
355
+ return ans;
356
+ };
357
+ ```
358
+
359
+ Morris 遍历:
360
+
361
+ ``` js
362
+ /**
363
+ * Definition for a binary tree node.
364
+ * function TreeNode(val, left, right) {
365
+ * this.val = (val===undefined ? 0 : val)
366
+ * this.left = (left===undefined ? null : left)
367
+ * this.right = (right===undefined ? null : right)
368
+ * }
369
+ */
370
+ /**
371
+ * @param {TreeNode} root
372
+ * @return {number[]}
373
+ */
374
+ var inorderTraversal = function (root ) {
375
+ let ans = [];
376
+ while (root) {
377
+ if (! root .left ) {
378
+ ans .push (root .val );
379
+ root = root .right ;
380
+ } else {
381
+ let prev = root .left ;
382
+ while (prev .right && prev .right != root) {
383
+ prev = prev .right ;
384
+ }
385
+ if (! prev .right ) {
386
+ prev .right = root;
387
+ root = root .left ;
388
+ } else {
389
+ ans .push (root .val );
390
+ prev .right = null ;
391
+ root = root .right ;
392
+ }
393
+ }
394
+ }
395
+ return ans;
353
396
};
354
397
```
355
398
@@ -370,33 +413,35 @@ var inorderTraversal = function (root) {
370
413
class Solution {
371
414
public:
372
415
vector<int > inorderTraversal(TreeNode* root) {
373
- vector<int > res ;
416
+ vector<int > ans ;
374
417
while (root)
375
418
{
376
- if (root->left == nullptr )
419
+ if (! root->left)
377
420
{
378
- res .push_back(root->val);
421
+ ans .push_back(root->val);
379
422
root = root->right;
380
- } else {
381
- TreeNode* pre = root->left;
382
- while (pre->right && pre->right != root)
423
+ }
424
+ else
425
+ {
426
+ TreeNode* prev = root->left;
427
+ while (prev->right && prev->right != root)
383
428
{
384
- pre = pre ->right;
429
+ prev = prev ->right;
385
430
}
386
- if (pre ->right == nullptr )
431
+ if (!prev ->right)
387
432
{
388
- pre ->right = root;
433
+ prev ->right = root;
389
434
root = root->left;
390
435
}
391
436
else
392
437
{
393
- res .push_back(root->val);
394
- pre ->right = nullptr;
438
+ ans .push_back(root->val);
439
+ prev ->right = nullptr;
395
440
root = root->right;
396
441
}
397
442
}
398
443
}
399
- return res ;
444
+ return ans ;
400
445
}
401
446
};
402
447
```
@@ -413,27 +458,27 @@ public:
413
458
* }
414
459
*/
415
460
func inorderTraversal(root *TreeNode) []int {
416
- var res []int
461
+ var ans []int
417
462
for root != nil {
418
463
if root.Left == nil {
419
- res = append(res , root.Val)
464
+ ans = append(ans , root.Val)
420
465
root = root.Right
421
466
} else {
422
- pre := root.Left
423
- for pre .Right != nil && pre .Right != root {
424
- pre = pre .Right
467
+ prev := root.Left
468
+ for prev .Right != nil && prev .Right != root {
469
+ prev = prev .Right
425
470
}
426
- if pre .Right == nil {
427
- pre .Right = root
471
+ if prev .Right == nil {
472
+ prev .Right = root
428
473
root = root.Left
429
474
} else {
430
- res = append(res , root.Val)
431
- pre .Right = nil
475
+ ans = append(ans , root.Val)
476
+ prev .Right = nil
432
477
root = root.Right
433
478
}
434
479
}
435
480
}
436
- return res
481
+ return ans
437
482
}
438
483
```
439
484
0 commit comments