Skip to content

Commit dc1d2bc

Browse files
committed
level order traversal
1 parent 65ee5d2 commit dc1d2bc

File tree

2 files changed

+186
-0
lines changed

2 files changed

+186
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// 102. Binary tree level order traversal
2+
// Topics: 'Breadth-First Search', 'Tree', 'Binary Tree'
3+
// Level: 'Medium'
4+
5+
// Given the root of a binary tree, return the level order traversal of its nodes' values. (i.e., from left to right, level by level).
6+
7+
// Example 1:
8+
9+
// Input: root = [3,9,20,null,null,15,7]
10+
// Output: [[3],[9,20],[15,7]]
11+
12+
// Example 2:
13+
14+
// Input: root = [1]
15+
// Output: [[1]]
16+
17+
// Example 3:
18+
19+
// Input: root = []
20+
// Output: []
21+
22+
// Constraints:
23+
24+
// The number of nodes in the tree is in the range [0, 2000].
25+
// -1000 <= Node.val <= 1000
26+
27+
package binarytreelevelordertraversal
28+
29+
func levelOrder(root *TreeNode) [][]int {
30+
var lvl int
31+
arr := [][]int{}
32+
if root == nil {
33+
return arr
34+
}
35+
q := []*TreeNode{root}
36+
37+
for len(q) != 0 {
38+
arr = append(arr, make([]int, len(q)))
39+
for i := range len(q) {
40+
tn := q[0]
41+
q = q[1:]
42+
arr[lvl][i] = tn.Val
43+
if tn.Left != nil {
44+
q = append(q, tn.Left)
45+
}
46+
if tn.Right != nil {
47+
q = append(q, tn.Right)
48+
}
49+
}
50+
lvl++
51+
}
52+
return arr
53+
}
54+
55+
type TreeNode struct {
56+
Val int
57+
Left *TreeNode
58+
Right *TreeNode
59+
}
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package binarytreelevelordertraversal
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
func TestLevelOrder(t *testing.T) {
9+
tests := []struct {
10+
name string
11+
root *TreeNode
12+
want [][]int
13+
}{
14+
{
15+
name: "example 1: tree with three levels",
16+
root: &TreeNode{
17+
Val: 3,
18+
Left: &TreeNode{Val: 9},
19+
Right: &TreeNode{
20+
Val: 20,
21+
Left: &TreeNode{Val: 15},
22+
Right: &TreeNode{Val: 7},
23+
},
24+
},
25+
want: [][]int{{3}, {9, 20}, {15, 7}},
26+
},
27+
{
28+
name: "example 2: single node",
29+
root: &TreeNode{Val: 1},
30+
want: [][]int{{1}},
31+
},
32+
{
33+
name: "example 3: empty tree",
34+
root: nil,
35+
want: [][]int{},
36+
},
37+
{
38+
name: "left skewed tree",
39+
root: &TreeNode{
40+
Val: 1,
41+
Left: &TreeNode{
42+
Val: 2,
43+
Left: &TreeNode{Val: 3},
44+
},
45+
},
46+
want: [][]int{{1}, {2}, {3}},
47+
},
48+
{
49+
name: "right skewed tree",
50+
root: &TreeNode{
51+
Val: 1,
52+
Right: &TreeNode{
53+
Val: 2,
54+
Right: &TreeNode{Val: 3},
55+
},
56+
},
57+
want: [][]int{{1}, {2}, {3}},
58+
},
59+
{
60+
name: "complete binary tree",
61+
root: &TreeNode{
62+
Val: 1,
63+
Left: &TreeNode{
64+
Val: 2,
65+
Left: &TreeNode{Val: 4},
66+
Right: &TreeNode{Val: 5},
67+
},
68+
Right: &TreeNode{
69+
Val: 3,
70+
Left: &TreeNode{Val: 6},
71+
Right: &TreeNode{Val: 7},
72+
},
73+
},
74+
want: [][]int{{1}, {2, 3}, {4, 5, 6, 7}},
75+
},
76+
{
77+
name: "tree with negative values",
78+
root: &TreeNode{
79+
Val: -1,
80+
Left: &TreeNode{Val: -2},
81+
Right: &TreeNode{Val: -3},
82+
},
83+
want: [][]int{{-1}, {-2, -3}},
84+
},
85+
{
86+
name: "tree with mixed positive and negative values",
87+
root: &TreeNode{
88+
Val: 0,
89+
Left: &TreeNode{Val: -1000},
90+
Right: &TreeNode{Val: 1000},
91+
},
92+
want: [][]int{{0}, {-1000, 1000}},
93+
},
94+
{
95+
name: "unbalanced tree with only left children at second level",
96+
root: &TreeNode{
97+
Val: 1,
98+
Left: &TreeNode{
99+
Val: 2,
100+
Left: &TreeNode{Val: 4},
101+
},
102+
Right: &TreeNode{
103+
Val: 3,
104+
Left: &TreeNode{Val: 5},
105+
},
106+
},
107+
want: [][]int{{1}, {2, 3}, {4, 5}},
108+
},
109+
{
110+
name: "two level tree with one child each",
111+
root: &TreeNode{
112+
Val: 10,
113+
Left: &TreeNode{Val: 20},
114+
},
115+
want: [][]int{{10}, {20}},
116+
},
117+
}
118+
119+
for _, tt := range tests {
120+
t.Run(tt.name, func(t *testing.T) {
121+
got := levelOrder(tt.root)
122+
if !reflect.DeepEqual(got, tt.want) {
123+
t.Errorf("levelOrder() = %v, want %v", got, tt.want)
124+
}
125+
})
126+
}
127+
}

0 commit comments

Comments
 (0)