Skip to content

Commit 65ee5d2

Browse files
committed
postorder/preorder traversal BST
1 parent f113300 commit 65ee5d2

File tree

4 files changed

+704
-0
lines changed

4 files changed

+704
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// 144. Binary tree preorder traversal
2+
// Topics: 'Stack', 'Tree', 'Binary Tree', 'Depth-First Search'
3+
4+
// Given the root of a binary tree, return the preorder traversal of its nodes' values.
5+
6+
// Example 1:
7+
8+
// Input: root = [1,null,2,3]
9+
10+
// Output: [1,2,3]
11+
12+
// Explanation:
13+
14+
// Example 2:
15+
16+
// Input: root = [1,2,3,4,5,null,8,null,null,6,7,9]
17+
18+
// Output: [1,2,4,5,6,7,3,8,9]
19+
20+
// Explanation:
21+
22+
// Example 3:
23+
24+
// Input: root = []
25+
26+
// Output: []
27+
28+
// Example 4:
29+
30+
// Input: root = [1]
31+
32+
// Output: [1]
33+
34+
// Constraints:
35+
36+
// The number of nodes in the tree is in the range [0, 100].
37+
// -100 <= Node.val <= 100
38+
39+
package binarytreepreordertraversal
40+
41+
func preorderTraversal(root *TreeNode) []int {
42+
arr := []int{}
43+
traversal(root, &arr)
44+
return arr
45+
}
46+
47+
func traversal(root *TreeNode, arr *[]int) {
48+
if root == nil {
49+
return
50+
}
51+
*arr = append(*arr, root.Val)
52+
traversal(root.Left, arr)
53+
traversal(root.Right, arr)
54+
}
55+
56+
type TreeNode struct {
57+
Val int
58+
Left *TreeNode
59+
Right *TreeNode
60+
}
Lines changed: 268 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,268 @@
1+
package binarytreepreordertraversal
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
func TestPreorderTraversal(t *testing.T) {
9+
tests := []struct {
10+
name string
11+
root *TreeNode
12+
want []int
13+
}{
14+
{
15+
name: "Example 1: Right-skewed with left child",
16+
root: &TreeNode{
17+
Val: 1,
18+
Right: &TreeNode{
19+
Val: 2,
20+
Left: &TreeNode{Val: 3},
21+
},
22+
},
23+
want: []int{1, 2, 3},
24+
},
25+
{
26+
name: "Example 2: Complex tree",
27+
root: &TreeNode{
28+
Val: 1,
29+
Left: &TreeNode{
30+
Val: 2,
31+
Left: &TreeNode{
32+
Val: 4,
33+
},
34+
Right: &TreeNode{
35+
Val: 5,
36+
Left: &TreeNode{Val: 6},
37+
Right: &TreeNode{Val: 7},
38+
},
39+
},
40+
Right: &TreeNode{
41+
Val: 3,
42+
Right: &TreeNode{
43+
Val: 8,
44+
Left: &TreeNode{Val: 9},
45+
},
46+
},
47+
},
48+
want: []int{1, 2, 4, 5, 6, 7, 3, 8, 9},
49+
},
50+
{
51+
name: "Example 3: Empty tree",
52+
root: nil,
53+
want: []int{},
54+
},
55+
{
56+
name: "Example 4: Single node",
57+
root: &TreeNode{Val: 1},
58+
want: []int{1},
59+
},
60+
{
61+
name: "Two nodes - left child only",
62+
root: &TreeNode{
63+
Val: 1,
64+
Left: &TreeNode{Val: 2},
65+
},
66+
want: []int{1, 2},
67+
},
68+
{
69+
name: "Two nodes - right child only",
70+
root: &TreeNode{
71+
Val: 1,
72+
Right: &TreeNode{Val: 2},
73+
},
74+
want: []int{1, 2},
75+
},
76+
{
77+
name: "Three nodes - complete binary tree",
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: "Left-skewed tree",
87+
root: &TreeNode{
88+
Val: 4,
89+
Left: &TreeNode{
90+
Val: 3,
91+
Left: &TreeNode{
92+
Val: 2,
93+
Left: &TreeNode{Val: 1},
94+
},
95+
},
96+
},
97+
want: []int{4, 3, 2, 1},
98+
},
99+
{
100+
name: "Right-skewed tree",
101+
root: &TreeNode{
102+
Val: 1,
103+
Right: &TreeNode{
104+
Val: 2,
105+
Right: &TreeNode{
106+
Val: 3,
107+
Right: &TreeNode{Val: 4},
108+
},
109+
},
110+
},
111+
want: []int{1, 2, 3, 4},
112+
},
113+
{
114+
name: "Balanced binary tree",
115+
root: &TreeNode{
116+
Val: 1,
117+
Left: &TreeNode{
118+
Val: 2,
119+
Left: &TreeNode{Val: 4},
120+
Right: &TreeNode{Val: 5},
121+
},
122+
Right: &TreeNode{
123+
Val: 3,
124+
Left: &TreeNode{Val: 6},
125+
Right: &TreeNode{Val: 7},
126+
},
127+
},
128+
want: []int{1, 2, 4, 5, 3, 6, 7},
129+
},
130+
{
131+
name: "Tree with negative values",
132+
root: &TreeNode{
133+
Val: 0,
134+
Left: &TreeNode{Val: -50},
135+
Right: &TreeNode{Val: 50},
136+
},
137+
want: []int{0, -50, 50},
138+
},
139+
{
140+
name: "Tree with boundary values",
141+
root: &TreeNode{
142+
Val: 0,
143+
Left: &TreeNode{
144+
Val: -100,
145+
Left: &TreeNode{Val: -99},
146+
Right: &TreeNode{Val: -98},
147+
},
148+
Right: &TreeNode{
149+
Val: 100,
150+
Left: &TreeNode{Val: 99},
151+
Right: &TreeNode{Val: 98},
152+
},
153+
},
154+
want: []int{0, -100, -99, -98, 100, 99, 98},
155+
},
156+
{
157+
name: "Unbalanced tree - heavy left",
158+
root: &TreeNode{
159+
Val: 5,
160+
Left: &TreeNode{
161+
Val: 3,
162+
Left: &TreeNode{
163+
Val: 1,
164+
Left: &TreeNode{Val: 0},
165+
Right: &TreeNode{Val: 2},
166+
},
167+
Right: &TreeNode{Val: 4},
168+
},
169+
Right: &TreeNode{Val: 6},
170+
},
171+
want: []int{5, 3, 1, 0, 2, 4, 6},
172+
},
173+
{
174+
name: "Unbalanced tree - heavy right",
175+
root: &TreeNode{
176+
Val: 1,
177+
Left: &TreeNode{Val: 0},
178+
Right: &TreeNode{
179+
Val: 3,
180+
Left: &TreeNode{Val: 2},
181+
Right: &TreeNode{
182+
Val: 5,
183+
Left: &TreeNode{Val: 4},
184+
Right: &TreeNode{Val: 6},
185+
},
186+
},
187+
},
188+
want: []int{1, 0, 3, 2, 5, 4, 6},
189+
},
190+
{
191+
name: "Deep left subtree only",
192+
root: &TreeNode{
193+
Val: 10,
194+
Left: &TreeNode{
195+
Val: 5,
196+
Left: &TreeNode{
197+
Val: 3,
198+
Left: &TreeNode{
199+
Val: 1,
200+
Left: &TreeNode{Val: 0},
201+
},
202+
},
203+
},
204+
},
205+
want: []int{10, 5, 3, 1, 0},
206+
},
207+
{
208+
name: "Zigzag pattern",
209+
root: &TreeNode{
210+
Val: 1,
211+
Left: &TreeNode{
212+
Val: 2,
213+
Right: &TreeNode{
214+
Val: 3,
215+
Left: &TreeNode{
216+
Val: 4,
217+
Right: &TreeNode{Val: 5},
218+
},
219+
},
220+
},
221+
},
222+
want: []int{1, 2, 3, 4, 5},
223+
},
224+
{
225+
name: "Maximum nodes (100 nodes would be too large, using smaller)",
226+
root: &TreeNode{
227+
Val: 1,
228+
Left: &TreeNode{
229+
Val: 2,
230+
Left: &TreeNode{Val: 3},
231+
Right: &TreeNode{Val: 4},
232+
},
233+
Right: &TreeNode{
234+
Val: 5,
235+
Left: &TreeNode{Val: 6},
236+
Right: &TreeNode{Val: 7},
237+
},
238+
},
239+
want: []int{1, 2, 3, 4, 5, 6, 7},
240+
},
241+
{
242+
name: "All same values",
243+
root: &TreeNode{
244+
Val: 1,
245+
Left: &TreeNode{
246+
Val: 1,
247+
Left: &TreeNode{Val: 1},
248+
Right: &TreeNode{Val: 1},
249+
},
250+
Right: &TreeNode{
251+
Val: 1,
252+
Left: &TreeNode{Val: 1},
253+
Right: &TreeNode{Val: 1},
254+
},
255+
},
256+
want: []int{1, 1, 1, 1, 1, 1, 1},
257+
},
258+
}
259+
260+
for _, tt := range tests {
261+
t.Run(tt.name, func(t *testing.T) {
262+
got := preorderTraversal(tt.root)
263+
if !reflect.DeepEqual(got, tt.want) {
264+
t.Errorf("preorderTraversal() = %v, want %v", got, tt.want)
265+
}
266+
})
267+
}
268+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// 145. Binary Tree Postorder Traversal
2+
// Topics: 'Stack', 'Tree', 'Binary Tree', 'Depth-First Search'
3+
4+
// Given the root of a binary tree, return the postorder traversal of its nodes' values.
5+
6+
// Example 1:
7+
8+
// Input: root = [1,null,2,3]
9+
10+
// Output: [3,2,1]
11+
12+
// Explanation:
13+
14+
// Example 2:
15+
16+
// Input: root = [1,2,3,4,5,null,8,null,null,6,7,9]
17+
18+
// Output: [4,6,7,5,2,9,8,3,1]
19+
20+
// Explanation:
21+
22+
// Example 3:
23+
24+
// Input: root = []
25+
26+
// Output: []
27+
28+
// Example 4:
29+
30+
// Input: root = [1]
31+
32+
// Output: [1]
33+
34+
// Constraints:
35+
36+
// The number of the nodes in the tree is in the range [0, 100].
37+
// -100 <= Node.val <= 100
38+
39+
package binarytreepreordertraversal
40+
41+
func postorderTraversal(root *TreeNode) []int {
42+
arr := []int{}
43+
traversal(root, &arr)
44+
return arr
45+
}
46+
47+
func traversal(root *TreeNode, arr *[]int) {
48+
if root == nil {
49+
return
50+
}
51+
52+
traversal(root.Left, arr)
53+
traversal(root.Right, arr)
54+
*arr = append(*arr, root.Val)
55+
}
56+
57+
type TreeNode struct {
58+
Val int
59+
Left *TreeNode
60+
Right *TreeNode
61+
}

0 commit comments

Comments
 (0)