35
35
36
36
## 解法
37
37
38
+ ** 方法一:BFS**
39
+
40
+ 为了实现锯齿形层序遍历,我们每次将当前层的节点添加到结果数组之前,先判断一下当前结果数组的长度,如果是奇数,就将当前层的节点反转一下。之后把当前层的节点添加到结果数组中即可。
41
+
42
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树的节点数。
43
+
38
44
<!-- tabs:start -->
39
45
40
46
### ** Python3**
50
56
51
57
class Solution :
52
58
def levelOrder (self , root : TreeNode) -> List[List[int ]]:
59
+ ans = []
53
60
if root is None :
54
- return []
55
- q = deque()
56
- res = []
57
- q.append(root)
61
+ return ans
62
+ q = deque([root])
63
+ ans = []
58
64
while q:
59
- size = len (q)
60
65
t = []
61
- for _ in range (size ):
66
+ for _ in range (len (q) ):
62
67
node = q.popleft()
63
68
t.append(node.val)
64
- if node.left is not None :
69
+ if node.left:
65
70
q.append(node.left)
66
- if node.right is not None :
71
+ if node.right:
67
72
q.append(node.right)
68
- res .append(t if len (res ) & 1 == 0 else t[:: - 1 ] )
69
- return res
73
+ ans .append(t[:: - 1 ] if len (ans ) & 1 else t)
74
+ return ans
70
75
```
71
76
72
77
### ** Java**
@@ -83,133 +88,151 @@ class Solution:
83
88
*/
84
89
class Solution {
85
90
public List<List<Integer > > levelOrder (TreeNode root ) {
86
- if (root == null ) return Collections . emptyList();
91
+ List<List<Integer > > ans = new ArrayList<> ();
92
+ if (root == null ) {
93
+ return ans;
94
+ }
87
95
Deque<TreeNode > q = new ArrayDeque<> ();
88
- List<List<Integer > > res = new ArrayList<> ();
89
96
q. offer(root);
90
97
while (! q. isEmpty()) {
91
- int size = q. size();
92
98
List<Integer > t = new ArrayList<> ();
93
- while ( size-- > 0 ) {
99
+ for ( int n = q . size(); n > 0 ; -- n ) {
94
100
TreeNode node = q. poll();
95
101
t. add(node. val);
96
- if (node. left != null ) q. offer(node. left);
97
- if (node. right != null ) q. offer(node. right);
102
+ if (node. left != null ) {
103
+ q. offer(node. left);
104
+ }
105
+ if (node. right != null ) {
106
+ q. offer(node. right);
107
+ }
98
108
}
99
- if ((res. size() & 1 ) == 1 ) Collections . reverse(t);
100
- res. add(t);
109
+ if (ans. size() % 2 == 1 ) {
110
+ Collections . reverse(t);
111
+ }
112
+ ans. add(t);
101
113
}
102
- return res ;
114
+ return ans ;
103
115
}
104
116
}
105
117
```
106
118
107
- ### ** JavaScript **
119
+ ### ** C++ **
108
120
109
- ``` js
121
+ ``` cpp
110
122
/* *
111
123
* Definition for a binary tree node.
112
- * function TreeNode(val) {
113
- * this.val = val;
114
- * this.left = this.right = null;
115
- * }
116
- */
117
- /**
118
- * @param {TreeNode} root
119
- * @return {number[][]}
124
+ * struct TreeNode {
125
+ * int val;
126
+ * TreeNode *left;
127
+ * TreeNode *right;
128
+ * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
129
+ * };
120
130
*/
121
- var levelOrder = function (root ) {
122
- if (! root) return [];
123
- let queue = [root];
124
- let res = [];
125
- let depth = 0 ;
126
- let dir = true ;
127
- while (queue .length ) {
128
- let len = queue .length ;
129
- for (let i = 0 ; i < len; i++ ) {
130
- let node = queue .shift ();
131
- if (! node) continue ;
132
- if (! res[depth]) res[depth] = [];
133
- if (dir) {
134
- res[depth].push (node .val );
135
- } else {
136
- res[depth].unshift (node .val );
131
+ class Solution {
132
+ public:
133
+ vector<vector<int >> levelOrder(TreeNode* root) {
134
+ vector<vector<int >> ans;
135
+ if (!root) {
136
+ return ans;
137
+ }
138
+ queue<TreeNode* > q{{root}};
139
+ while (!q.empty()) {
140
+ vector<int > t;
141
+ for (int n = q.size(); n; --n) {
142
+ auto node = q.front();
143
+ q.pop();
144
+ t.push_back(node->val);
145
+ if (node->left) {
146
+ q.push(node->left);
147
+ }
148
+ if (node->right) {
149
+ q.push(node->right);
150
+ }
137
151
}
138
- queue .push (node .left , node .right );
152
+ if (ans.size() & 1) {
153
+ reverse(t.begin(), t.end());
154
+ }
155
+ ans.emplace_back(t);
139
156
}
140
- depth++ ;
141
- dir = ! dir;
157
+ return ans;
142
158
}
143
- return res;
144
159
};
145
160
```
146
161
147
162
### **Go**
148
163
149
164
```go
150
- func levelOrder (root *TreeNode ) [][]int {
151
- if root == nil {
152
- return nil
153
- }
154
- res := [][]int {}
155
- queue := []*TreeNode{}
156
- queue = append (queue,root)
157
- level := 0
158
- for len (queue) != 0 {
159
- size := len (queue)
160
- ans := []int {}
161
- // size记录每层大小,level记录层数
162
- for size > 0 {
163
- cur := queue[0 ]
164
- if level & 1 == 0 {
165
- ans = append (ans, cur.Val )
166
- } else {
167
- ans = append ([]int {cur.Val },ans...)
168
- }
169
-
170
- queue = queue[1 :]
171
- size--
172
- if cur.Left != nil {
173
- queue = append (queue, cur.Left )
174
- }
175
- if cur.Right != nil {
176
- queue = append (queue, cur.Right )
177
- }
178
- }
179
- level++
180
- res = append (res, ans)
181
- }
182
- return res
165
+ /**
166
+ * Definition for a binary tree node.
167
+ * type TreeNode struct {
168
+ * Val int
169
+ * Left *TreeNode
170
+ * Right *TreeNode
171
+ * }
172
+ */
173
+ func levelOrder(root *TreeNode) (ans [][]int) {
174
+ if root == nil {
175
+ return
176
+ }
177
+ q := []*TreeNode{root}
178
+ for len(q) > 0 {
179
+ t := []int{}
180
+ for n := len(q); n > 0; n-- {
181
+ node := q[0]
182
+ q = q[1:]
183
+ t = append(t, node.Val)
184
+ if node.Left != nil {
185
+ q = append(q, node.Left)
186
+ }
187
+ if node.Right != nil {
188
+ q = append(q, node.Right)
189
+ }
190
+ }
191
+ if len(ans)&1 == 1 {
192
+ for i, j := 0, len(t)-1; i < j; i, j = i+1, j-1 {
193
+ t[i], t[j] = t[j], t[i]
194
+ }
195
+ }
196
+ ans = append(ans, t)
197
+ }
198
+ return
183
199
}
184
200
```
185
201
186
- ### ** C++ **
202
+ ### ** JavaScript **
187
203
188
- ``` cpp
189
- class Solution {
190
- public:
191
- vector<vector<int >> levelOrder(TreeNode* root) {
192
- vector<vector<int >> ans;
193
- if (root == NULL) return ans;
194
- queue<TreeNode* > q;
195
- q.push(root);
196
- bool flag = false;
197
- while (!q.empty()) {
198
- int n = q.size();
199
- vector<int > v;
200
- for (int i = 0; i < n; ++i) {
201
- TreeNode* node = q.front();
202
- q.pop();
203
- v.emplace_back(node->val);
204
- if (node->left) q.push(node->left);
205
- if (node->right) q.push(node->right);
206
- }
207
- if (flag) reverse(v.begin(), v.end());
208
- flag = !flag;
209
- ans.emplace_back(v);
210
- }
204
+ ``` js
205
+ /**
206
+ * Definition for a binary tree node.
207
+ * function TreeNode(val) {
208
+ * this.val = val;
209
+ * this.left = this.right = null;
210
+ * }
211
+ */
212
+ /**
213
+ * @param {TreeNode} root
214
+ * @return {number[][]}
215
+ */
216
+ var levelOrder = function (root ) {
217
+ const ans = [];
218
+ if (! root) {
211
219
return ans;
212
220
}
221
+ const q = [root];
222
+ while (q .length ) {
223
+ const t = [];
224
+ for (let n = q .length ; n; -- n) {
225
+ const { val , left , right } = q .shift ();
226
+ t .push (val);
227
+ left && q .push (left);
228
+ right && q .push (right);
229
+ }
230
+ if (ans .length & 1 ) {
231
+ t .reverse ();
232
+ }
233
+ ans .push (t);
234
+ }
235
+ return ans;
213
236
};
214
237
```
215
238
@@ -331,25 +354,22 @@ public class Solution {
331
354
}
332
355
var q = new Queue <TreeNode >();
333
356
q .Enqueue (root );
334
- int i = 0 ;
335
357
while (q .Count > 0 ) {
336
- var tmp = new List <int >();
337
- int x = q .Count ;
338
- for (int j = 0 ; j < x ; j ++ ) {
358
+ var t = new List <int >();
359
+ for (int n = q .Count ; n > 0 ; -- n ) {
339
360
var node = q .Dequeue ();
340
- tmp .Add (node .val );
361
+ t .Add (node .val );
341
362
if (node .left != null ) {
342
363
q .Enqueue (node .left );
343
364
}
344
365
if (node .right != null ) {
345
366
q .Enqueue (node .right );
346
367
}
347
368
}
348
- if (i % 2 == 1 ) {
349
- tmp .Reverse ();
369
+ if (ans . Count % 2 == 1 ) {
370
+ t .Reverse ();
350
371
}
351
- ans .Add (tmp );
352
- i += 1 ;
372
+ ans .Add (t );
353
373
}
354
374
return ans ;
355
375
}
0 commit comments