Skip to content

Commit 7ebbddf

Browse files
committed
feat: add solutions to lc problem: No.0103
No.0103.Binary Tree Zigzag Level Order Traversal
1 parent 87bb69b commit 7ebbddf

File tree

8 files changed

+128
-136
lines changed

8 files changed

+128
-136
lines changed

solution/0100-0199/0103.Binary Tree Zigzag Level Order Traversal/README.md

+45-45
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@
4444

4545
<!-- 这里可写通用的实现逻辑 -->
4646

47+
**方法一:BFS**
48+
49+
为了实现锯齿形层序遍历,需要在层序遍历的基础上增加一个标志位 `left`,用于标记当前层的节点值的顺序。如果 `left``true`,则当前层的节点值按照从左到右的顺序存入结果数组 `ans` 中;如果 `left``false`,则当前层的节点值按照从右到左的顺序存入结果数组 `ans` 中。
50+
51+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树的节点数。
52+
4753
<!-- tabs:start -->
4854

4955
### **Python3**
@@ -58,25 +64,24 @@
5864
# self.left = left
5965
# self.right = right
6066
class Solution:
61-
def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
67+
def zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
68+
ans = []
6269
if root is None:
63-
return []
64-
left, ans = False, []
70+
return ans
6571
q = deque([root])
72+
ans = []
73+
left = 1
6674
while q:
67-
n = len(q)
6875
t = []
69-
for _ in range(n):
76+
for _ in range(len(q)):
7077
node = q.popleft()
7178
t.append(node.val)
7279
if node.left:
7380
q.append(node.left)
7481
if node.right:
7582
q.append(node.right)
76-
if left:
77-
t.reverse()
78-
ans.append(t)
79-
left = not left
83+
ans.append(t if left else t[::-1])
84+
left ^= 1
8085
return ans
8186
```
8287

@@ -102,17 +107,17 @@ class Solution:
102107
*/
103108
class Solution {
104109
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
110+
List<List<Integer>> ans = new ArrayList<>();
105111
if (root == null) {
106-
return Collections.emptyList();
112+
return ans;
107113
}
108114
Deque<TreeNode> q = new ArrayDeque<>();
109115
q.offer(root);
110-
boolean left = false;
111-
List<List<Integer>> ans = new ArrayList<>();
116+
boolean left = true;
112117
while (!q.isEmpty()) {
113118
List<Integer> t = new ArrayList<>();
114-
for (int i = 0, n = q.size(); i < n; ++i) {
115-
TreeNode node = q.pollFirst();
119+
for (int n = q.size(); n > 0; --n) {
120+
TreeNode node = q.poll();
116121
t.add(node.val);
117122
if (node.left != null) {
118123
q.offer(node.left);
@@ -121,7 +126,7 @@ class Solution {
121126
q.offer(node.right);
122127
}
123128
}
124-
if (left) {
129+
if (!left) {
125130
Collections.reverse(t);
126131
}
127132
ans.add(t);
@@ -149,22 +154,22 @@ class Solution {
149154
class Solution {
150155
public:
151156
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
152-
if (!root) return {};
153-
queue<TreeNode*> q {{root}};
154157
vector<vector<int>> ans;
155-
bool left = false;
158+
if (!root) return ans;
159+
queue<TreeNode*> q{{root}};
160+
int left = 1;
156161
while (!q.empty()) {
157162
vector<int> t;
158-
for (int i = 0, n = q.size(); i < n; ++i) {
163+
for (int n = q.size(); n; --n) {
159164
auto node = q.front();
160165
q.pop();
161-
t.push_back(node->val);
166+
t.emplace_back(node->val);
162167
if (node->left) q.push(node->left);
163168
if (node->right) q.push(node->right);
164169
}
165-
if (left) reverse(t.begin(), t.end());
166-
ans.push_back(t);
167-
left = !left;
170+
if (!left) reverse(t.begin(), t.end());
171+
ans.emplace_back(t);
172+
left ^= 1;
168173
}
169174
return ans;
170175
}
@@ -182,17 +187,15 @@ public:
182187
* Right *TreeNode
183188
* }
184189
*/
185-
func zigzagLevelOrder(root *TreeNode) [][]int {
190+
func zigzagLevelOrder(root *TreeNode) (ans [][]int) {
186191
if root == nil {
187-
return nil
192+
return
188193
}
189-
var ans [][]int
190-
var q = []*TreeNode{root}
191-
left := false
194+
q := []*TreeNode{root}
195+
left := true
192196
for len(q) > 0 {
193-
var t []int
194-
n := len(q)
195-
for i := 0; i < n; i++ {
197+
t := []int{}
198+
for n := len(q); n > 0; n-- {
196199
node := q[0]
197200
q = q[1:]
198201
t = append(t, node.Val)
@@ -203,18 +206,15 @@ func zigzagLevelOrder(root *TreeNode) [][]int {
203206
q = append(q, node.Right)
204207
}
205208
}
206-
if left {
207-
i, j := 0, n-1
208-
for i < j {
209+
if !left {
210+
for i, j := 0, len(t)-1; i < j; i, j = i+1, j-1 {
209211
t[i], t[j] = t[j], t[i]
210-
i++
211-
j--
212212
}
213213
}
214214
ans = append(ans, t)
215215
left = !left
216216
}
217-
return ans
217+
return
218218
}
219219
```
220220

@@ -234,15 +234,15 @@ func zigzagLevelOrder(root *TreeNode) [][]int {
234234
* @return {number[][]}
235235
*/
236236
var zigzagLevelOrder = function (root) {
237+
const ans = [];
237238
if (!root) {
238-
return [];
239+
return ans;
239240
}
240-
let ans = [];
241-
let q = [root];
242-
let left = false;
241+
const q = [root];
242+
let left = 1;
243243
while (q.length) {
244-
let t = [];
245-
for (let i = 0, n = q.length; i < n; ++i) {
244+
const t = [];
245+
for (let n = q.length; n; --n) {
246246
const node = q.shift();
247247
t.push(node.val);
248248
if (node.left) {
@@ -252,11 +252,11 @@ var zigzagLevelOrder = function (root) {
252252
q.push(node.right);
253253
}
254254
}
255-
if (left) {
255+
if (!left) {
256256
t.reverse();
257257
}
258258
ans.push(t);
259-
left = !left;
259+
left ^= 1;
260260
}
261261
return ans;
262262
};

solution/0100-0199/0103.Binary Tree Zigzag Level Order Traversal/README_EN.md

+39-45
Original file line numberDiff line numberDiff line change
@@ -50,25 +50,24 @@
5050
# self.left = left
5151
# self.right = right
5252
class Solution:
53-
def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
53+
def zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
54+
ans = []
5455
if root is None:
55-
return []
56-
left, ans = False, []
56+
return ans
5757
q = deque([root])
58+
ans = []
59+
left = 1
5860
while q:
59-
n = len(q)
6061
t = []
61-
for _ in range(n):
62+
for _ in range(len(q)):
6263
node = q.popleft()
6364
t.append(node.val)
6465
if node.left:
6566
q.append(node.left)
6667
if node.right:
6768
q.append(node.right)
68-
if left:
69-
t.reverse()
70-
ans.append(t)
71-
left = not left
69+
ans.append(t if left else t[::-1])
70+
left ^= 1
7271
return ans
7372
```
7473

@@ -92,17 +91,17 @@ class Solution:
9291
*/
9392
class Solution {
9493
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
94+
List<List<Integer>> ans = new ArrayList<>();
9595
if (root == null) {
96-
return Collections.emptyList();
96+
return ans;
9797
}
9898
Deque<TreeNode> q = new ArrayDeque<>();
9999
q.offer(root);
100-
boolean left = false;
101-
List<List<Integer>> ans = new ArrayList<>();
100+
boolean left = true;
102101
while (!q.isEmpty()) {
103102
List<Integer> t = new ArrayList<>();
104-
for (int i = 0, n = q.size(); i < n; ++i) {
105-
TreeNode node = q.pollFirst();
103+
for (int n = q.size(); n > 0; --n) {
104+
TreeNode node = q.poll();
106105
t.add(node.val);
107106
if (node.left != null) {
108107
q.offer(node.left);
@@ -111,7 +110,7 @@ class Solution {
111110
q.offer(node.right);
112111
}
113112
}
114-
if (left) {
113+
if (!left) {
115114
Collections.reverse(t);
116115
}
117116
ans.add(t);
@@ -139,22 +138,22 @@ class Solution {
139138
class Solution {
140139
public:
141140
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
142-
if (!root) return {};
143-
queue<TreeNode*> q {{root}};
144141
vector<vector<int>> ans;
145-
bool left = false;
142+
if (!root) return ans;
143+
queue<TreeNode*> q{{root}};
144+
int left = 1;
146145
while (!q.empty()) {
147146
vector<int> t;
148-
for (int i = 0, n = q.size(); i < n; ++i) {
147+
for (int n = q.size(); n; --n) {
149148
auto node = q.front();
150149
q.pop();
151-
t.push_back(node->val);
150+
t.emplace_back(node->val);
152151
if (node->left) q.push(node->left);
153152
if (node->right) q.push(node->right);
154153
}
155-
if (left) reverse(t.begin(), t.end());
156-
ans.push_back(t);
157-
left = !left;
154+
if (!left) reverse(t.begin(), t.end());
155+
ans.emplace_back(t);
156+
left ^= 1;
158157
}
159158
return ans;
160159
}
@@ -172,17 +171,15 @@ public:
172171
* Right *TreeNode
173172
* }
174173
*/
175-
func zigzagLevelOrder(root *TreeNode) [][]int {
174+
func zigzagLevelOrder(root *TreeNode) (ans [][]int) {
176175
if root == nil {
177-
return nil
176+
return
178177
}
179-
var ans [][]int
180-
var q = []*TreeNode{root}
181-
left := false
178+
q := []*TreeNode{root}
179+
left := true
182180
for len(q) > 0 {
183-
var t []int
184-
n := len(q)
185-
for i := 0; i < n; i++ {
181+
t := []int{}
182+
for n := len(q); n > 0; n-- {
186183
node := q[0]
187184
q = q[1:]
188185
t = append(t, node.Val)
@@ -193,18 +190,15 @@ func zigzagLevelOrder(root *TreeNode) [][]int {
193190
q = append(q, node.Right)
194191
}
195192
}
196-
if left {
197-
i, j := 0, n-1
198-
for i < j {
193+
if !left {
194+
for i, j := 0, len(t)-1; i < j; i, j = i+1, j-1 {
199195
t[i], t[j] = t[j], t[i]
200-
i++
201-
j--
202196
}
203197
}
204198
ans = append(ans, t)
205199
left = !left
206200
}
207-
return ans
201+
return
208202
}
209203
```
210204

@@ -224,15 +218,15 @@ func zigzagLevelOrder(root *TreeNode) [][]int {
224218
* @return {number[][]}
225219
*/
226220
var zigzagLevelOrder = function (root) {
221+
const ans = [];
227222
if (!root) {
228-
return [];
223+
return ans;
229224
}
230-
let ans = [];
231-
let q = [root];
232-
let left = false;
225+
const q = [root];
226+
let left = 1;
233227
while (q.length) {
234-
let t = [];
235-
for (let i = 0, n = q.length; i < n; ++i) {
228+
const t = [];
229+
for (let n = q.length; n; --n) {
236230
const node = q.shift();
237231
t.push(node.val);
238232
if (node.left) {
@@ -242,11 +236,11 @@ var zigzagLevelOrder = function (root) {
242236
q.push(node.right);
243237
}
244238
}
245-
if (left) {
239+
if (!left) {
246240
t.reverse();
247241
}
248242
ans.push(t);
249-
left = !left;
243+
left ^= 1;
250244
}
251245
return ans;
252246
};

0 commit comments

Comments
 (0)