Skip to content

Commit fcf4ced

Browse files
committed
feat: update solutions to lcof problems: 32 - |,32 - ||,32 - |||
- 面试题32 - I. 从上到下打印二叉树 - 面试题32 - II. 从上到下打印二叉树 II - 面试题32 - III. 从上到下打印二叉树 III
1 parent 6e4b052 commit fcf4ced

File tree

10 files changed

+144
-160
lines changed

10 files changed

+144
-160
lines changed

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

+26-26
Original file line numberDiff line numberDiff line change
@@ -156,31 +156,35 @@ func levelOrder(root *TreeNode) []int {
156156
### **C++**
157157

158158
```cpp
159+
/**
160+
* Definition for a binary tree node.
161+
* struct TreeNode {
162+
* int val;
163+
* TreeNode *left;
164+
* TreeNode *right;
165+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
166+
* };
167+
*/
159168
class Solution {
160169
public:
161-
vector<int> levelOrder(TreeNode* root) {
162-
vector<int> ret;
163-
if (!root) {
164-
return ret;
165-
}
166-
170+
vector<int> levelOrder(TreeNode *root) {
171+
vector<int> res;
167172
queue<TreeNode *> q;
168-
q.push(root);
169-
173+
if (root != nullptr) {
174+
q.push(root);
175+
}
170176
while (!q.empty()) {
171-
auto head = q.front();
177+
TreeNode *node = q.front();
172178
q.pop();
173-
ret.push_back(head->val);
174-
if (head->left) {
175-
q.push(head->left);
179+
if (node->left != nullptr) {
180+
q.push(node->left);
176181
}
177-
178-
if (head->right) {
179-
q.push(head->right);
182+
if (node->right != nullptr) {
183+
q.push(node->right);
180184
}
185+
res.push_back(node->val);
181186
}
182-
183-
return ret;
187+
return res;
184188
}
185189
};
186190
```
@@ -207,15 +211,12 @@ function levelOrder(root: TreeNode | null): number[] {
207211
if (root == null) {
208212
return res;
209213
}
210-
211-
const arr = [root];
212-
let i = 0;
213-
while (i < arr.length) {
214-
const { val, left, right } = arr[i];
214+
const queue = [root];
215+
while (queue.length !== 0) {
216+
const { val, left, right } = queue.shift();
215217
res.push(val);
216-
left && arr.push(left);
217-
right && arr.push(right);
218-
i++;
218+
left && queue.push(left);
219+
right && queue.push(right);
219220
}
220221
return res;
221222
}
@@ -245,7 +246,6 @@ function levelOrder(root: TreeNode | null): number[] {
245246
use std::rc::Rc;
246247
use std::cell::RefCell;
247248
use std::collections::VecDeque;
248-
249249
impl Solution {
250250
pub fn level_order(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
251251
let mut res = Vec::new();

lcof/面试题32 - I. 从上到下打印二叉树/Solution.cpp

+12-18
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,25 @@
77
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
88
* };
99
*/
10-
1110
class Solution {
1211
public:
13-
vector<int> levelOrder(TreeNode* root) {
14-
vector<int> ret;
15-
if (!root) {
16-
return ret;
17-
}
18-
12+
vector<int> levelOrder(TreeNode *root) {
13+
vector<int> res;
1914
queue<TreeNode *> q;
20-
q.push(root);
21-
15+
if (root != nullptr) {
16+
q.push(root);
17+
}
2218
while (!q.empty()) {
23-
auto head = q.front();
19+
TreeNode *node = q.front();
2420
q.pop();
25-
ret.push_back(head->val);
26-
if (head->left) {
27-
q.push(head->left);
21+
if (node->left != nullptr) {
22+
q.push(node->left);
2823
}
29-
30-
if (head->right) {
31-
q.push(head->right);
24+
if (node->right != nullptr) {
25+
q.push(node->right);
3226
}
27+
res.push_back(node->val);
3328
}
34-
35-
return ret;
29+
return res;
3630
}
3731
};

lcof/面试题32 - I. 从上到下打印二叉树/Solution.rs

-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
use std::rc::Rc;
2020
use std::cell::RefCell;
2121
use std::collections::VecDeque;
22-
2322
impl Solution {
2423
pub fn level_order(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
2524
let mut res = Vec::new();

lcof/面试题32 - I. 从上到下打印二叉树/Solution.ts

+5-8
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,12 @@ function levelOrder(root: TreeNode | null): number[] {
1717
if (root == null) {
1818
return res;
1919
}
20-
21-
const arr = [root];
22-
let i = 0;
23-
while (i < arr.length) {
24-
const { val, left, right } = arr[i];
20+
const queue = [root];
21+
while (queue.length !== 0) {
22+
const { val, left, right } = queue.shift();
2523
res.push(val);
26-
left && arr.push(left);
27-
right && arr.push(right);
28-
i++;
24+
left && queue.push(left);
25+
right && queue.push(right);
2926
}
3027
return res;
3128
}

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

+24-26
Original file line numberDiff line numberDiff line change
@@ -219,21 +219,19 @@ function levelOrder(root: TreeNode | null): number[][] {
219219
if (root == null) {
220220
return res;
221221
}
222-
const levelFn = (nodes: TreeNode[]) => {
223-
if (nodes.length === 0) {
224-
return res;
222+
const queue = [root];
223+
while (queue.length !== 0) {
224+
const n = queue.length;
225+
const tmp = new Array(n);
226+
for (let i = 0; i < n; i++) {
227+
const { val, left, right } = queue.shift();
228+
tmp[i] = val;
229+
left && queue.push(left);
230+
right && queue.push(right);
225231
}
226-
const nextNodes = [];
227-
res.push(
228-
nodes.map(({ val, left, right }) => {
229-
left && nextNodes.push(left);
230-
right && nextNodes.push(right);
231-
return val;
232-
}),
233-
);
234-
return levelFn(nextNodes);
235-
};
236-
return levelFn([root]);
232+
res.push(tmp);
233+
}
234+
return res;
237235
}
238236
```
239237

@@ -261,29 +259,29 @@ function levelOrder(root: TreeNode | null): number[][] {
261259
use std::rc::Rc;
262260
use std::cell::RefCell;
263261
use std::collections::VecDeque;
264-
265262
impl Solution {
266263
pub fn level_order(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<Vec<i32>> {
267264
let mut res = Vec::new();
268265
if root.is_none() {
269266
return res;
270267
}
271-
let mut nodes = VecDeque::new();
272-
nodes.push_back(root.unwrap());
273-
while !nodes.is_empty() {
274-
let mut values = Vec::new();
275-
for _ in 0..nodes.len() {
276-
let node = nodes.pop_front().unwrap();
277-
let mut node = node.borrow_mut();
278-
values.push(node.val);
268+
let mut queue = VecDeque::new();
269+
queue.push_back(root);
270+
while !queue.is_empty() {
271+
let n = queue.len();
272+
let mut vals = Vec::with_capacity(n);
273+
for _ in 0..n {
274+
let mut node = queue.pop_front().unwrap();
275+
let mut node = node.as_mut().unwrap().borrow_mut();
276+
vals.push(node.val);
279277
if node.left.is_some() {
280-
nodes.push_back(node.left.take().unwrap())
278+
queue.push_back(node.left.take());
281279
}
282280
if node.right.is_some() {
283-
nodes.push_back(node.right.take().unwrap())
281+
queue.push_back(node.right.take());
284282
}
285283
}
286-
res.push(values);
284+
res.push(vals);
287285
}
288286
res
289287
}

lcof/面试题32 - II. 从上到下打印二叉树 II/Solution.rs

+12-12
Original file line numberDiff line numberDiff line change
@@ -19,29 +19,29 @@
1919
use std::rc::Rc;
2020
use std::cell::RefCell;
2121
use std::collections::VecDeque;
22-
2322
impl Solution {
2423
pub fn level_order(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<Vec<i32>> {
2524
let mut res = Vec::new();
2625
if root.is_none() {
2726
return res;
2827
}
29-
let mut nodes = VecDeque::new();
30-
nodes.push_back(root.unwrap());
31-
while !nodes.is_empty() {
32-
let mut values = Vec::new();
33-
for _ in 0..nodes.len() {
34-
let node = nodes.pop_front().unwrap();
35-
let mut node = node.borrow_mut();
36-
values.push(node.val);
28+
let mut queue = VecDeque::new();
29+
queue.push_back(root);
30+
while !queue.is_empty() {
31+
let n = queue.len();
32+
let mut vals = Vec::with_capacity(n);
33+
for _ in 0..n {
34+
let mut node = queue.pop_front().unwrap();
35+
let mut node = node.as_mut().unwrap().borrow_mut();
36+
vals.push(node.val);
3737
if node.left.is_some() {
38-
nodes.push_back(node.left.take().unwrap())
38+
queue.push_back(node.left.take());
3939
}
4040
if node.right.is_some() {
41-
nodes.push_back(node.right.take().unwrap())
41+
queue.push_back(node.right.take());
4242
}
4343
}
44-
res.push(values);
44+
res.push(vals);
4545
}
4646
res
4747
}

lcof/面试题32 - II. 从上到下打印二叉树 II/Solution.ts

+12-14
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,17 @@ function levelOrder(root: TreeNode | null): number[][] {
1717
if (root == null) {
1818
return res;
1919
}
20-
const levelFn = (nodes: TreeNode[]) => {
21-
if (nodes.length === 0) {
22-
return res;
20+
const queue = [root];
21+
while (queue.length !== 0) {
22+
const n = queue.length;
23+
const tmp = new Array(n);
24+
for (let i = 0; i < n; i++) {
25+
const { val, left, right } = queue.shift();
26+
tmp[i] = val;
27+
left && queue.push(left);
28+
right && queue.push(right);
2329
}
24-
const nextNodes = [];
25-
res.push(
26-
nodes.map(({ val, left, right }) => {
27-
left && nextNodes.push(left);
28-
right && nextNodes.push(right);
29-
return val;
30-
}),
31-
);
32-
return levelFn(nextNodes);
33-
};
34-
return levelFn([root]);
30+
res.push(tmp);
31+
}
32+
return res;
3533
}

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

+26-27
Original file line numberDiff line numberDiff line change
@@ -235,21 +235,20 @@ function levelOrder(root: TreeNode | null): number[][] {
235235
return res;
236236
}
237237
let isEven = false;
238-
const levelFn = (nodes: TreeNode[]) => {
239-
if (nodes.length === 0) {
240-
return res;
238+
const queue = [root];
239+
while (queue.length !== 0) {
240+
const n = queue.length;
241+
const vals = new Array(n);
242+
for (let i = 0; i < n; i++) {
243+
const { val, left, right } = queue.shift();
244+
vals[i] = val;
245+
left && queue.push(left);
246+
right && queue.push(right);
241247
}
242-
const nextNodes = [];
243-
const values = nodes.map(({ val, left, right }) => {
244-
left && nextNodes.push(left);
245-
right && nextNodes.push(right);
246-
return val;
247-
});
248-
res.push(isEven ? values.reverse() : values);
248+
res.push(isEven ? vals.reverse() : vals);
249249
isEven = !isEven;
250-
return levelFn(nextNodes);
251-
};
252-
return levelFn([root]);
250+
}
251+
return res;
253252
}
254253
```
255254

@@ -277,34 +276,34 @@ function levelOrder(root: TreeNode | null): number[][] {
277276
use std::rc::Rc;
278277
use std::cell::RefCell;
279278
use std::collections::VecDeque;
280-
281279
impl Solution {
282280
pub fn level_order(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<Vec<i32>> {
283281
let mut res = Vec::new();
284282
if root.is_none() {
285283
return res;
286284
}
287-
let mut nodes = VecDeque::new();
288-
nodes.push_back(root.unwrap());
285+
let mut queue = VecDeque::new();
286+
queue.push_back(root);
289287
let mut is_even = false;
290-
while !nodes.is_empty() {
291-
let mut values = Vec::new();
292-
for _ in 0..nodes.len() {
293-
let node = nodes.pop_front().unwrap();
294-
let mut node = node.borrow_mut();
295-
values.push(node.val);
288+
while !queue.is_empty() {
289+
let n = queue.len();
290+
let mut vals = Vec::with_capacity(n);
291+
for _ in 0..n {
292+
let mut node = queue.pop_front().unwrap();
293+
let mut node = node.as_mut().unwrap().borrow_mut();
294+
vals.push(node.val);
296295
if node.left.is_some() {
297-
nodes.push_back(node.left.take().unwrap())
296+
queue.push_back(node.left.take());
298297
}
299298
if node.right.is_some() {
300-
nodes.push_back(node.right.take().unwrap())
299+
queue.push_back(node.right.take());
301300
}
302301
}
303302
if is_even {
304-
values.reverse()
303+
vals.reverse();
305304
}
306-
res.push(values);
307-
is_even = !is_even
305+
res.push(vals);
306+
is_even = !is_even;
308307
}
309308
res
310309
}

0 commit comments

Comments
 (0)