Skip to content

Commit 9b06d1f

Browse files
committed
feat(solutions): add binary_tree_zigzag_level_order_traversal
1 parent 57e5ed5 commit 9b06d1f

File tree

5 files changed

+167
-0
lines changed

5 files changed

+167
-0
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ If you like it then you can put a :star:**Star** on it.
3434
3535
| # | **Problem** & **Solution** | Difficulty | Single Repetition Duration | LeetCode Run Time |
3636
| ---: | :----- | :----------: | ----------: | ----------: |
37+
|[103][Solutions-103]|[Binary Tree Zigzag Level Order Traversal][Solutions-103-Home]|Medium|[78.6 ns/op][Solutions-103-Code] / [3 test cases][Solutions-103-Test]|0 ms|
3738
|[102][Solutions-102]|[Binary Tree Level Order Traversal][Solutions-102-Home]|Medium|[76.0 ns/op][Solutions-102-Code] / [3 test cases][Solutions-102-Test]|8 ms|
3839
|[101][Solutions-101]|[Symmetric Tree][Solutions-101-Home]|Easy|[17.6 ns/op][Solutions-101-Code] / [5 test cases][Solutions-101-Test]|4 ms|
3940
|[100][Solutions-100]|[Same Tree][Solutions-100-Home]|Easy|[9.12 ns/op][Solutions-100-Code] / [6 test cases][Solutions-100-Test]|0 ms|
@@ -158,6 +159,10 @@ Welcome to report bugs, suggest ideas and discuss on [issues page](https://githu
158159
## License
159160
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2FWindomZ%2Fleetcode.go.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2FWindomZ%2Fleetcode.go?ref=badge_large)
160161

162+
[Solutions-103]:https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/
163+
[Solutions-103-Home]:solutions/binary_tree_zigzag_level_order_traversal/
164+
[Solutions-103-Code]:solutions/binary_tree_zigzag_level_order_traversal/binarytreezigzaglevelordertraversal.go
165+
[Solutions-103-Test]:solutions/binary_tree_zigzag_level_order_traversal/binarytreezigzaglevelordertraversal_test.go#L62
161166
[Solutions-102]:https://leetcode.com/problems/binary-tree-level-order-traversal/
162167
[Solutions-102-Home]:solutions/binary_tree_level_order_traversal/
163168
[Solutions-102-Code]:solutions/binary_tree_level_order_traversal/binarytreelevelordertraversal.go
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# 解法要点
2+
1. 运用递归遍历解法思想
3+
1. 利用层级参数,遍历累计各层级的值
4+
1. 奇数层级,值倒序处理
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# [103. Binary Tree Zigzag Level Order Traversal](https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/description/)
2+
3+
## Description
4+
5+
Given a binary tree, return the _zigzag level order_ traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).
6+
7+
For example:
8+
9+
Given binary tree `[3,9,20,null,null,15,7]`,
10+
```
11+
3
12+
/ \
13+
9 20
14+
/ \
15+
15 7
16+
```
17+
18+
return its zigzag level order traversal as:
19+
```
20+
[
21+
[3],
22+
[20,9],
23+
[15,7]
24+
]
25+
```
26+
27+
## Solution
28+
- [Code](binarytreezigzaglevelordertraversal.go)
29+
- [Testing](binarytreezigzaglevelordertraversal_test.go)
30+
31+
## Note
32+
- [中文](NOTE_Ch-zh.md)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package binarytreezigzaglevelordertraversal
2+
3+
// TreeNode definition for a binary tree node.
4+
type TreeNode struct {
5+
Val int
6+
Left *TreeNode
7+
Right *TreeNode
8+
}
9+
10+
func zigzagLevelOrder(root *TreeNode) [][]int {
11+
if root == nil {
12+
return [][]int{}
13+
}
14+
level := make([][]int, 0, 4)
15+
zigzagOrder(root, &level, 0)
16+
for depth, nodes := range level {
17+
if depth%2 != 0 { // right to left traversal
18+
l := len(nodes)
19+
for i := 0; i < l/2; i++ {
20+
nodes[i], nodes[l-i-1] = nodes[l-i-1], nodes[i]
21+
}
22+
}
23+
}
24+
return level
25+
}
26+
27+
func zigzagOrder(root *TreeNode, level *[][]int, depth int) {
28+
if root == nil {
29+
return
30+
}
31+
if len(*level) <= depth {
32+
*level = append(*level, make([]int, 0, depth*2))
33+
}
34+
(*level)[depth] = append((*level)[depth], root.Val) // level[depth] append the value of node
35+
zigzagOrder(root.Left, level, depth+1) // left traversal
36+
zigzagOrder(root.Right, level, depth+1) // right traversal
37+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package binarytreezigzaglevelordertraversal
2+
3+
import (
4+
"testing"
5+
6+
"github.com/WindomZ/testify/assert"
7+
)
8+
9+
func Test_zigzagLevelOrder(t *testing.T) {
10+
assert.Equal(t, [][]int{}, zigzagLevelOrder(nil))
11+
assert.Equal(t,
12+
[][]int{
13+
{1},
14+
}, zigzagLevelOrder(&TreeNode{
15+
Val: 1,
16+
}))
17+
assert.Equal(t,
18+
[][]int{
19+
{3},
20+
{20, 9},
21+
{15, 7},
22+
}, zigzagLevelOrder(&TreeNode{
23+
Val: 3,
24+
Left: &TreeNode{
25+
Val: 9,
26+
},
27+
Right: &TreeNode{
28+
Val: 20,
29+
Left: &TreeNode{
30+
Val: 15,
31+
},
32+
Right: &TreeNode{
33+
Val: 7,
34+
},
35+
},
36+
}))
37+
assert.Equal(t,
38+
[][]int{
39+
{3},
40+
{20, 9},
41+
{11, 15, 7},
42+
}, zigzagLevelOrder(&TreeNode{
43+
Val: 3,
44+
Left: &TreeNode{
45+
Val: 9,
46+
Right: &TreeNode{
47+
Val: 11,
48+
},
49+
},
50+
Right: &TreeNode{
51+
Val: 20,
52+
Left: &TreeNode{
53+
Val: 15,
54+
},
55+
Right: &TreeNode{
56+
Val: 7,
57+
},
58+
},
59+
}))
60+
}
61+
62+
func Benchmark_zigzagLevelOrder(b *testing.B) {
63+
b.StopTimer()
64+
b.ReportAllocs()
65+
b.StartTimer()
66+
b.RunParallel(func(pb *testing.PB) {
67+
for pb.Next() {
68+
zigzagLevelOrder(nil)
69+
zigzagLevelOrder(&TreeNode{
70+
Val: 1,
71+
})
72+
zigzagLevelOrder(&TreeNode{
73+
Val: 3,
74+
Left: &TreeNode{
75+
Val: 9,
76+
},
77+
Right: &TreeNode{
78+
Val: 20,
79+
Left: &TreeNode{
80+
Val: 15,
81+
},
82+
Right: &TreeNode{
83+
Val: 7,
84+
},
85+
},
86+
})
87+
}
88+
})
89+
}

0 commit comments

Comments
 (0)