28
28
29
29
<!-- 这里可写通用的实现逻辑 -->
30
30
31
- 层序遍历。
31
+ ** 方法一:BFS 层序遍历**
32
+
33
+ 我们可以使用 BFS 层序遍历的方法,每次遍历一层,将当前层的节点值存入链表中,然后将链表加入到结果数组中。
34
+
35
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树的节点数。
32
36
33
37
<!-- tabs:start -->
34
38
44
48
# self.left = None
45
49
# self.right = None
46
50
47
-
48
51
# Definition for singly-linked list.
49
52
# class ListNode:
50
53
# def __init__(self, x):
51
54
# self.val = x
52
55
# self.next = None
56
+
57
+
53
58
class Solution :
54
59
def listOfDepth (self , tree : TreeNode) -> List[ListNode]:
55
- q = [tree]
56
60
ans = []
61
+ q = deque([tree])
57
62
while q:
58
- n = len (q)
59
- head = ListNode(- 1 )
60
- tail = head
61
- for i in range (n):
62
- front = q.pop(0 )
63
- node = ListNode(front.val)
64
- tail.next = node
65
- tail = node
66
- if front.left:
67
- q.append(front.left)
68
- if front.right:
69
- q.append(front.right)
70
- ans.append(head.next)
63
+ dummy = cur = ListNode(0 )
64
+ for _ in range (len (q)):
65
+ node = q.popleft()
66
+ cur.next = ListNode(node.val)
67
+ cur = cur.next
68
+ if node.left:
69
+ q.append(node.left)
70
+ if node.right:
71
+ q.append(node.right)
72
+ ans.append(dummy.next)
71
73
return ans
72
74
```
73
75
@@ -95,26 +97,24 @@ class Solution:
95
97
*/
96
98
class Solution {
97
99
public ListNode [] listOfDepth (TreeNode tree ) {
98
- Queue<TreeNode > queue = new LinkedList<> ();
99
- queue. offer(tree);
100
100
List<ListNode > ans = new ArrayList<> ();
101
- while ( ! queue . isEmpty()) {
102
- int n = queue . size( );
103
- ListNode head = new ListNode ( - 1 );
104
- ListNode tail = head ;
105
- for ( int i = 0 ; i < n; i ++ ) {
106
- TreeNode front = queue . poll ();
107
- ListNode node = new ListNode (front . val );
108
- tail . next = node;
109
- tail = node ;
110
- if (front . left != null ) {
111
- queue . offer(front . left);
101
+ Deque< TreeNode > q = new ArrayDeque<> ();
102
+ q . offer(tree );
103
+ while ( ! q . isEmpty()) {
104
+ ListNode dummy = new ListNode ( 0 ) ;
105
+ ListNode cur = dummy;
106
+ for ( int k = q . size (); k > 0 ; -- k) {
107
+ TreeNode node = q . poll( );
108
+ cur . next = new ListNode ( node. val) ;
109
+ cur = cur . next ;
110
+ if (node . left != null ) {
111
+ q . offer(node . left);
112
112
}
113
- if (front . right != null ) {
114
- queue . offer(front . right);
113
+ if (node . right != null ) {
114
+ q . offer(node . right);
115
115
}
116
116
}
117
- ans. add(head . next);
117
+ ans. add(dummy . next);
118
118
}
119
119
return ans. toArray(new ListNode [0 ]);
120
120
}
@@ -145,29 +145,23 @@ class Solution {
145
145
public:
146
146
vector<ListNode* > listOfDepth(TreeNode* tree) {
147
147
vector<ListNode* > ans;
148
- if (tree == nullptr) {
149
- return ans;
150
- }
151
- queue<TreeNode* > q;
152
- q.push(tree);
148
+ queue<TreeNode* > q{{tree}};
153
149
while (!q.empty()) {
154
- int n = q.size();
155
- ListNode* head = new ListNode(-1);
156
- ListNode* tail = head;
157
- for (int i = 0; i < n; ++i) {
158
- TreeNode* front = q.front();
150
+ ListNode* dummy = new ListNode(0);
151
+ ListNode* cur = dummy;
152
+ for (int k = q.size(); k; --k) {
153
+ TreeNode* node = q.front();
159
154
q.pop();
160
- ListNode* node = new ListNode(front->val);
161
- tail->next = node;
162
- tail = node;
163
- if (front->left != nullptr) {
164
- q.push(front->left);
155
+ cur->next = new ListNode(node->val);
156
+ cur = cur->next;
157
+ if (node->left) {
158
+ q.push(node->left);
165
159
}
166
- if (front ->right != nullptr ) {
167
- q.push(front ->right);
160
+ if (node ->right) {
161
+ q.push(node ->right);
168
162
}
169
163
}
170
- ans.push_back(head ->next);
164
+ ans.push_back(dummy ->next);
171
165
}
172
166
return ans;
173
167
}
@@ -192,30 +186,26 @@ public:
192
186
* Next *ListNode
193
187
* }
194
188
*/
195
- func listOfDepth(tree *TreeNode) []*ListNode {
196
- queue := make([]*TreeNode, 0)
197
- queue = append(queue, tree)
198
- ans := make([]*ListNode, 0)
199
- for len(queue) > 0 {
200
- n := len(queue)
201
- head := new(ListNode)
202
- tail := head
203
- for i := 0; i < n; i++ {
204
- front := queue[0]
205
- queue = queue[1:]
206
- node := &ListNode{Val: front.Val}
207
- tail.Next = node
208
- tail = node
209
- if front.Left != nil {
210
- queue = append(queue, front.Left)
189
+ func listOfDepth(tree *TreeNode) (ans []*ListNode) {
190
+ q := []*TreeNode{tree}
191
+ for len(q) > 0 {
192
+ dummy := &ListNode{}
193
+ cur := dummy
194
+ for k := len(q); k > 0; k-- {
195
+ node := q[0]
196
+ q = q[1:]
197
+ cur.Next = &ListNode{Val: node.Val}
198
+ cur = cur.Next
199
+ if node.Left != nil {
200
+ q = append(q, node.Left)
211
201
}
212
- if front .Right != nil {
213
- queue = append(queue, front .Right)
202
+ if node .Right != nil {
203
+ q = append(q, node .Right)
214
204
}
215
205
}
216
- ans = append(ans, head .Next)
206
+ ans = append(ans, dummy .Next)
217
207
}
218
- return ans
208
+ return
219
209
}
220
210
```
221
211
@@ -249,25 +239,21 @@ func listOfDepth(tree *TreeNode) []*ListNode {
249
239
*/
250
240
251
241
function listOfDepth(tree : TreeNode | null ): Array <ListNode | null > {
252
- const res = [];
253
- if (tree == null ) {
254
- return res ;
255
- }
256
- const queue = [tree ];
257
- while (queue .length !== 0 ) {
258
- const n = queue .length ;
242
+ const ans: Array <ListNode | null > = [];
243
+ const q: Array <TreeNode | null > = [tree ];
244
+ while (q .length ) {
259
245
const dummy = new ListNode ();
260
246
let cur = dummy ;
261
- for (let i = 0 ; i < n ; i ++ ) {
262
- const { val, left, right } = queue .shift ();
263
- left && queue .push (left );
264
- right && queue .push (right );
247
+ for (let k = q .length ; k ; -- k ) {
248
+ const { val, left, right } = q .shift ()! ;
265
249
cur .next = new ListNode (val );
266
250
cur = cur .next ;
251
+ left && q .push (left );
252
+ right && q .push (right );
267
253
}
268
- res .push (dummy .next );
254
+ ans .push (dummy .next );
269
255
}
270
- return res ;
256
+ return ans ;
271
257
}
272
258
```
273
259
0 commit comments