Skip to content

Commit d489f15

Browse files
committed
feat: add solutions to lcof problem: No.32.3
1 parent cecffb5 commit d489f15

File tree

7 files changed

+245
-211
lines changed

7 files changed

+245
-211
lines changed

lcof/面试题32 - III. 从上到下打印二叉树 III/README.md

+135-115
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@
3535

3636
## 解法
3737

38+
**方法一:BFS**
39+
40+
为了实现锯齿形层序遍历,我们每次将当前层的节点添加到结果数组之前,先判断一下当前结果数组的长度,如果是奇数,就将当前层的节点反转一下。之后把当前层的节点添加到结果数组中即可。
41+
42+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树的节点数。
43+
3844
<!-- tabs:start -->
3945

4046
### **Python3**
@@ -50,23 +56,22 @@
5056

5157
class Solution:
5258
def levelOrder(self, root: TreeNode) -> List[List[int]]:
59+
ans = []
5360
if root is None:
54-
return []
55-
q = deque()
56-
res = []
57-
q.append(root)
61+
return ans
62+
q = deque([root])
63+
ans = []
5864
while q:
59-
size = len(q)
6065
t = []
61-
for _ in range(size):
66+
for _ in range(len(q)):
6267
node = q.popleft()
6368
t.append(node.val)
64-
if node.left is not None:
69+
if node.left:
6570
q.append(node.left)
66-
if node.right is not None:
71+
if node.right:
6772
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
7075
```
7176

7277
### **Java**
@@ -83,133 +88,151 @@ class Solution:
8388
*/
8489
class Solution {
8590
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+
}
8795
Deque<TreeNode> q = new ArrayDeque<>();
88-
List<List<Integer>> res = new ArrayList<>();
8996
q.offer(root);
9097
while (!q.isEmpty()) {
91-
int size = q.size();
9298
List<Integer> t = new ArrayList<>();
93-
while (size-- > 0) {
99+
for (int n = q.size(); n > 0; --n) {
94100
TreeNode node = q.poll();
95101
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+
}
98108
}
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);
101113
}
102-
return res;
114+
return ans;
103115
}
104116
}
105117
```
106118

107-
### **JavaScript**
119+
### **C++**
108120

109-
```js
121+
```cpp
110122
/**
111123
* 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+
* };
120130
*/
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+
}
137151
}
138-
queue.push(node.left, node.right);
152+
if (ans.size() & 1) {
153+
reverse(t.begin(), t.end());
154+
}
155+
ans.emplace_back(t);
139156
}
140-
depth++;
141-
dir = !dir;
157+
return ans;
142158
}
143-
return res;
144159
};
145160
```
146161
147162
### **Go**
148163
149164
```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
183199
}
184200
```
185201

186-
### **C++**
202+
### **JavaScript**
187203

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) {
211219
return ans;
212220
}
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;
213236
};
214237
```
215238

@@ -331,25 +354,22 @@ public class Solution {
331354
}
332355
var q = new Queue<TreeNode>();
333356
q.Enqueue(root);
334-
int i = 0;
335357
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) {
339360
var node = q.Dequeue();
340-
tmp.Add(node.val);
361+
t.Add(node.val);
341362
if (node.left != null) {
342363
q.Enqueue(node.left);
343364
}
344365
if (node.right != null) {
345366
q.Enqueue(node.right);
346367
}
347368
}
348-
if (i % 2 == 1) {
349-
tmp.Reverse();
369+
if (ans.Count % 2 == 1) {
370+
t.Reverse();
350371
}
351-
ans.Add(tmp);
352-
i += 1;
372+
ans.Add(t);
353373
}
354374
return ans;
355375
}
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,38 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
8+
* };
9+
*/
110
class Solution {
211
public:
312
vector<vector<int>> levelOrder(TreeNode* root) {
413
vector<vector<int>> ans;
5-
if (root == NULL) return ans;
6-
queue<TreeNode*> q;
7-
q.push(root);
8-
bool flag = false;
14+
if (!root) {
15+
return ans;
16+
}
17+
queue<TreeNode*> q{{root}};
918
while (!q.empty()) {
10-
int n = q.size();
11-
vector<int> v;
12-
for (int i = 0; i < n; ++i) {
13-
TreeNode* node = q.front();
19+
vector<int> t;
20+
for (int n = q.size(); n; --n) {
21+
auto node = q.front();
1422
q.pop();
15-
v.emplace_back(node->val);
16-
if (node->left) q.push(node->left);
17-
if (node->right) q.push(node->right);
23+
t.push_back(node->val);
24+
if (node->left) {
25+
q.push(node->left);
26+
}
27+
if (node->right) {
28+
q.push(node->right);
29+
}
30+
}
31+
if (ans.size() & 1) {
32+
reverse(t.begin(), t.end());
1833
}
19-
if (flag) reverse(v.begin(), v.end());
20-
flag = !flag;
21-
ans.emplace_back(v);
34+
ans.emplace_back(t);
2235
}
2336
return ans;
2437
}
25-
};
38+
};

0 commit comments

Comments
 (0)