70
70
71
71
非递归的思路如下:
72
72
73
- 1 . 定义一个栈,先将根节点压入栈
73
+ 1 . 定义一个栈 stk ,先将根节点压入栈
74
74
2 . 若栈不为空,每次从栈中弹出一个节点
75
75
3 . 处理该节点
76
76
4 . 先把节点右孩子压入栈,接着把节点左孩子压入栈(如果有孩子节点)
@@ -83,10 +83,10 @@ Morris 遍历无需使用栈,空间复杂度为 O(1)。核心思想是:
83
83
84
84
遍历二叉树节点,
85
85
86
- 1 . 若当前节点 root 的左子树为空,** 将当前节点值添加至结果列表 res ** 中,并将当前节点更新为 ` root.right `
87
- 2 . 若当前节点 root 的左子树不为空,找到左子树的最右节点 pre (也即是 root 节点在中序遍历下的前驱节点):
88
- - 若前驱节点 pre 的右子树为空,** 将当前节点值添加至结果列表 res ** 中,然后将前驱节点的右子树指向当前节点 root,并将当前节点更新为 ` root.left ` 。
89
- - 若前驱节点 pre 的右子树不为空,将前驱节点右子树指向空(即解除 pre 与 root 的指向关系),并将当前节点更新为 ` root.right ` 。
86
+ 1 . 若当前节点 root 的左子树为空,** 将当前节点值添加至结果列表 ans ** 中,并将当前节点更新为 ` root.right `
87
+ 2 . 若当前节点 root 的左子树不为空,找到左子树的最右节点 prev (也即是 root 节点在中序遍历下的前驱节点):
88
+ - 若前驱节点 prev 的右子树为空,** 将当前节点值添加至结果列表 ans ** 中,然后将前驱节点的右子树指向当前节点 root,并将当前节点更新为 ` root.left ` 。
89
+ - 若前驱节点 prev 的右子树不为空,将前驱节点右子树指向空(即解除 prev 与 root 的指向关系),并将当前节点更新为 ` root.right ` 。
90
90
3 . 循环以上步骤,直至二叉树节点为空,遍历结束。
91
91
92
92
<!-- tabs:start -->
@@ -105,17 +105,18 @@ Morris 遍历无需使用栈,空间复杂度为 O(1)。核心思想是:
105
105
# self.left = left
106
106
# self.right = right
107
107
class Solution :
108
- def preorderTraversal (self , root : TreeNode) -> List[int ]:
109
- res = []
110
-
111
- def preorder (root ):
112
- if root:
113
- res.append(root.val)
114
- preorder(root.left)
115
- preorder(root.right)
116
-
117
- preorder(root)
118
- return res
108
+ def preorderTraversal (self , root : Optional[TreeNode]) -> List[int ]:
109
+ def dfs (root ):
110
+ if root is None :
111
+ return
112
+ nonlocal ans
113
+ ans.append(root.val)
114
+ dfs(root.left)
115
+ dfs(root.right)
116
+
117
+ ans = []
118
+ dfs(root)
119
+ return ans
119
120
```
120
121
121
122
栈实现非递归:
@@ -128,18 +129,19 @@ class Solution:
128
129
# self.left = left
129
130
# self.right = right
130
131
class Solution :
131
- def preorderTraversal (self , root : TreeNode) -> List[int ]:
132
- res = []
133
- if root:
134
- s = [root]
135
- while s:
136
- node = s.pop()
137
- res.append(node.val)
138
- if node.right:
139
- s.append(node.right)
140
- if node.left:
141
- s.append(node.left)
142
- return res
132
+ def preorderTraversal (self , root : Optional[TreeNode]) -> List[int ]:
133
+ ans = []
134
+ if root is None :
135
+ return ans
136
+ stk = [root]
137
+ while stk:
138
+ node = stk.pop()
139
+ ans.append(node.val)
140
+ if node.right:
141
+ stk.append(node.right)
142
+ if node.left:
143
+ stk.append(node.left)
144
+ return ans
143
145
```
144
146
145
147
Morris 遍历:
@@ -152,24 +154,24 @@ Morris 遍历:
152
154
# self.left = left
153
155
# self.right = right
154
156
class Solution :
155
- def preorderTraversal (self , root : TreeNode) -> List[int ]:
156
- res = []
157
+ def preorderTraversal (self , root : Optional[ TreeNode] ) -> List[int ]:
158
+ ans = []
157
159
while root:
158
160
if root.left is None :
159
- res .append(root.val)
161
+ ans .append(root.val)
160
162
root = root.right
161
163
else :
162
- pre = root.left
163
- while pre .right and pre .right != root:
164
- pre = pre .right
165
- if pre .right is None :
166
- res .append(root.val)
167
- pre .right = root
164
+ prev = root.left
165
+ while prev .right and prev .right != root:
166
+ prev = prev .right
167
+ if prev .right is None :
168
+ ans .append(root.val)
169
+ prev .right = root
168
170
root = root.left
169
171
else :
170
- pre .right = None
172
+ prev .right = None
171
173
root = root.right
172
- return res
174
+ return ans
173
175
```
174
176
175
177
### ** Java**
@@ -195,18 +197,21 @@ class Solution:
195
197
* }
196
198
*/
197
199
class Solution {
200
+ private List<Integer > ans;
201
+
198
202
public List<Integer > preorderTraversal (TreeNode root ) {
199
- List< Integer > res = new ArrayList<> ();
200
- preorder (root, res );
201
- return res ;
203
+ ans = new ArrayList<> ();
204
+ dfs (root);
205
+ return ans ;
202
206
}
203
207
204
- private void preorder (TreeNode root , List<Integer > res ) {
205
- if (root != null ) {
206
- res. add(root. val);
207
- preorder(root. left, res);
208
- preorder(root. right, res);
208
+ private void dfs (TreeNode root ) {
209
+ if (root == null ) {
210
+ return ;
209
211
}
212
+ ans. add(root. val);
213
+ dfs(root. left);
214
+ dfs(root. right);
210
215
}
211
216
}
212
217
```
@@ -231,22 +236,23 @@ class Solution {
231
236
*/
232
237
class Solution {
233
238
public List<Integer > preorderTraversal (TreeNode root ) {
234
- List<Integer > res = new ArrayList<> ();
235
- if (root != null ) {
236
- Deque<TreeNode > s = new LinkedList<> ();
237
- s. offerLast(root);
238
- while (! s. isEmpty()) {
239
- TreeNode node = s. pollLast();
240
- res. add(node. val);
241
- if (node. right != null ) {
242
- s. offerLast(node. right);
243
- }
244
- if (node. left != null ) {
245
- s. offerLast(node. left);
246
- }
239
+ List<Integer > ans = new ArrayList<> ();
240
+ if (root == null ) {
241
+ return ans;
242
+ }
243
+ Deque<TreeNode > stk = new ArrayDeque<> ();
244
+ stk. push(root);
245
+ while (! stk. isEmpty()) {
246
+ TreeNode node = stk. pop();
247
+ ans. add(node. val);
248
+ if (node. right != null ) {
249
+ stk. push(node. right);
250
+ }
251
+ if (node. left != null ) {
252
+ stk. push(node. left);
247
253
}
248
254
}
249
- return res ;
255
+ return ans ;
250
256
}
251
257
}
252
258
```
@@ -271,27 +277,27 @@ Morris 遍历:
271
277
*/
272
278
class Solution {
273
279
public List<Integer > preorderTraversal (TreeNode root ) {
274
- List<Integer > res = new ArrayList<> ();
280
+ List<Integer > ans = new ArrayList<> ();
275
281
while (root != null ) {
276
282
if (root. left == null ) {
277
- res . add(root. val);
283
+ ans . add(root. val);
278
284
root = root. right;
279
285
} else {
280
- TreeNode pre = root. left;
281
- while (pre . right != null && pre . right != root) {
282
- pre = pre . right;
286
+ TreeNode prev = root. left;
287
+ while (prev . right != null && prev . right != root) {
288
+ prev = prev . right;
283
289
}
284
- if (pre . right == null ) {
285
- res . add(root. val);
286
- pre . right = root;
290
+ if (prev . right == null ) {
291
+ ans . add(root. val);
292
+ prev . right = root;
287
293
root = root. left;
288
294
} else {
289
- pre . right = null ;
295
+ prev . right = null ;
290
296
root = root. right;
291
297
}
292
298
}
293
299
}
294
- return res ;
300
+ return ans ;
295
301
}
296
302
}
297
303
```
@@ -314,17 +320,54 @@ class Solution {
314
320
*/
315
321
316
322
function preorderTraversal(root : TreeNode | null ): number [] {
317
- if (root == null ) return [];
318
- let stack = [];
319
323
let ans = [];
320
- while (root || stack .length ) {
321
- while (root ) {
324
+ if (! root ) return ans ;
325
+ let stk = [root ];
326
+ while (stk .length ) {
327
+ let node = stk .pop ();
328
+ ans .push (node .val );
329
+ if (node .right ) stk .push (node .right );
330
+ if (node .left ) stk .push (node .left );
331
+ }
332
+ return ans ;
333
+ }
334
+ ```
335
+
336
+ ``` ts
337
+ /**
338
+ * Definition for a binary tree node.
339
+ * class TreeNode {
340
+ * val: number
341
+ * left: TreeNode | null
342
+ * right: TreeNode | null
343
+ * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
344
+ * this.val = (val===undefined ? 0 : val)
345
+ * this.left = (left===undefined ? null : left)
346
+ * this.right = (right===undefined ? null : right)
347
+ * }
348
+ * }
349
+ */
350
+
351
+ function preorderTraversal(root : TreeNode | null ): number [] {
352
+ let ans = [];
353
+ while (root ) {
354
+ if (! root .left ) {
322
355
ans .push (root .val );
323
- stack .push (root );
324
- root = root .left ;
356
+ root = root .right ;
357
+ } else {
358
+ let prev = root .left ;
359
+ while (prev .right && prev .right != root ) {
360
+ prev = prev .right ;
361
+ }
362
+ if (! prev .right ) {
363
+ ans .push (root .val );
364
+ prev .right = root ;
365
+ root = root .left ;
366
+ } else {
367
+ prev .right = null ;
368
+ root = root .right ;
369
+ }
325
370
}
326
- root = stack .pop ();
327
- root = root .right ;
328
371
}
329
372
return ans ;
330
373
}
@@ -346,36 +389,36 @@ function preorderTraversal(root: TreeNode | null): number[] {
346
389
*/
347
390
class Solution {
348
391
public:
349
- vector<int > preorderTraversal(TreeNode * root) {
350
- vector<int > res ;
392
+ vector<int > preorderTraversal(TreeNode* root) {
393
+ vector<int > ans ;
351
394
while (root)
352
395
{
353
- if (root->left == nullptr )
396
+ if (! root->left)
354
397
{
355
- res .push_back(root->val);
398
+ ans .push_back(root->val);
356
399
root = root->right;
357
400
}
358
401
else
359
402
{
360
- TreeNode * pre = root->left;
361
- while (pre ->right && pre ->right != root)
403
+ TreeNode* prev = root->left;
404
+ while (prev ->right && prev ->right != root)
362
405
{
363
- pre = pre ->right;
406
+ prev = prev ->right;
364
407
}
365
- if (pre ->right == nullptr )
408
+ if (!prev ->right)
366
409
{
367
- res .push_back(root->val);
368
- pre ->right = root;
410
+ ans .push_back(root->val);
411
+ prev ->right = root;
369
412
root = root->left;
370
413
}
371
414
else
372
415
{
373
- pre ->right = nullptr;
416
+ prev ->right = nullptr;
374
417
root = root->right;
375
418
}
376
419
}
377
420
}
378
- return res ;
421
+ return ans ;
379
422
}
380
423
};
381
424
```
@@ -392,27 +435,27 @@ public:
392
435
* }
393
436
*/
394
437
func preorderTraversal(root *TreeNode) []int {
395
- var res []int
438
+ var ans []int
396
439
for root != nil {
397
440
if root.Left == nil {
398
- res = append(res , root.Val)
441
+ ans = append(ans , root.Val)
399
442
root = root.Right
400
443
} else {
401
- pre := root.Left
402
- for pre .Right != nil && pre .Right != root {
403
- pre = pre .Right
444
+ prev := root.Left
445
+ for prev .Right != nil && prev .Right != root {
446
+ prev = prev .Right
404
447
}
405
- if pre .Right == nil {
406
- res = append(res , root.Val)
407
- pre .Right = root
448
+ if prev .Right == nil {
449
+ ans = append(ans , root.Val)
450
+ prev .Right = root
408
451
root = root.Left
409
452
} else {
410
- pre .Right = nil
453
+ prev .Right = nil
411
454
root = root.Right
412
455
}
413
456
}
414
457
}
415
- return res
458
+ return ans
416
459
}
417
460
```
418
461
0 commit comments