Skip to content

Commit fb66b4e

Browse files
committed
binary tree preorder traversal without recurrsion
1 parent fb518b8 commit fb66b4e

File tree

5 files changed

+165
-0
lines changed

5 files changed

+165
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Problem: 144. Binary Tree Preorder Traversal
2+
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package binarytreepreordertraversal
2+
3+
// TreeNode data structure
4+
type TreeNode struct {
5+
Val int
6+
Left *TreeNode
7+
Right *TreeNode
8+
}
9+
10+
// Stack data structure that implements LIFO
11+
type Stack []*TreeNode
12+
13+
// Push adds an item onto the stack.
14+
func (s *Stack) Push(node *TreeNode) {
15+
*s = append(*s, node)
16+
}
17+
18+
// Pop removes the most-recently-pushed item from the stack.
19+
func (s *Stack) Pop() *TreeNode {
20+
arr := *s
21+
last := len(arr) - 1
22+
top := arr[last]
23+
if len(arr) > 0 {
24+
arr = arr[0:last]
25+
} else {
26+
arr = []*TreeNode{}
27+
}
28+
*s = arr
29+
return top
30+
}
31+
32+
// Nice explanation: https://www.hackerearth.com/practice/notes/iterative-tree-traversals/
33+
func preorderTraversal(root *TreeNode) []int {
34+
ret := []int{}
35+
if root == nil {
36+
return ret
37+
}
38+
stack := Stack{root}
39+
for len(stack) > 0 {
40+
node := stack.Pop()
41+
ret = append(ret, node.Val)
42+
if node.Right != nil {
43+
stack.Push(node.Right)
44+
}
45+
if node.Left != nil {
46+
stack.Push(node.Left)
47+
}
48+
}
49+
return ret
50+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package binarytreepreordertraversal
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
func TestPreorderTraversal(t *testing.T) {
9+
testCases := []struct {
10+
Input *TreeNode
11+
Output []int
12+
}{
13+
{
14+
Input: &TreeNode{
15+
Val: 1,
16+
Left: nil,
17+
Right: &TreeNode{
18+
Val: 2,
19+
Right: &TreeNode{
20+
Val: 3,
21+
},
22+
},
23+
},
24+
Output: []int{1, 2, 3},
25+
},
26+
{
27+
Input: nil,
28+
Output: []int{},
29+
},
30+
{
31+
Input: &TreeNode{
32+
Val: 3,
33+
Left: &TreeNode{
34+
Val: 1,
35+
},
36+
Right: &TreeNode{
37+
Val: 2,
38+
},
39+
},
40+
Output: []int{3, 1, 2},
41+
},
42+
}
43+
44+
for _, test := range testCases {
45+
out := preorderTraversal(test.Input)
46+
if !reflect.DeepEqual(test.Output, out) {
47+
t.Errorf("expected to get %#v, but got %#v", test.Output, out)
48+
}
49+
}
50+
}

coverage.txt

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
2+
mode: atomic
3+
github.com/vfedoroff/leetcode/permutations/main.go:5.34,13.12 8 2
4+
github.com/vfedoroff/leetcode/permutations/main.go:33.2,33.15 1 2
5+
github.com/vfedoroff/leetcode/permutations/main.go:13.12,14.15 1 16
6+
github.com/vfedoroff/leetcode/permutations/main.go:14.15,15.16 1 5
7+
github.com/vfedoroff/leetcode/permutations/main.go:23.4,27.9 5 5
8+
github.com/vfedoroff/leetcode/permutations/main.go:15.16,17.5 1 2
9+
github.com/vfedoroff/leetcode/permutations/main.go:17.5,19.5 1 3
10+
github.com/vfedoroff/leetcode/permutations/main.go:28.4,31.4 2 11
11+
mode: atomic
12+
github.com/vfedoroff/leetcode/remove-duplicates-from-sorted-array/main.go:3.39,5.22 2 1
13+
github.com/vfedoroff/leetcode/remove-duplicates-from-sorted-array/main.go:8.2,9.27 2 1
14+
github.com/vfedoroff/leetcode/remove-duplicates-from-sorted-array/main.go:15.2,17.10 3 1
15+
github.com/vfedoroff/leetcode/remove-duplicates-from-sorted-array/main.go:5.22,7.3 1 0
16+
github.com/vfedoroff/leetcode/remove-duplicates-from-sorted-array/main.go:9.27,10.27 1 2
17+
github.com/vfedoroff/leetcode/remove-duplicates-from-sorted-array/main.go:10.27,13.4 2 1
18+
mode: atomic
19+
github.com/vfedoroff/leetcode/remove-element/main.go:3.45,5.12 2 3
20+
github.com/vfedoroff/leetcode/remove-element/main.go:8.2,9.25 2 3
21+
github.com/vfedoroff/leetcode/remove-element/main.go:15.2,15.10 1 3
22+
github.com/vfedoroff/leetcode/remove-element/main.go:5.12,7.3 1 0
23+
github.com/vfedoroff/leetcode/remove-element/main.go:9.25,10.21 1 8
24+
github.com/vfedoroff/leetcode/remove-element/main.go:10.21,13.4 2 2
25+
mode: atomic
26+
github.com/vfedoroff/leetcode/reverse-integer/main.go:14.25,17.14 3 7
27+
github.com/vfedoroff/leetcode/reverse-integer/main.go:20.2,20.13 1 7
28+
github.com/vfedoroff/leetcode/reverse-integer/main.go:25.2,25.23 1 7
29+
github.com/vfedoroff/leetcode/reverse-integer/main.go:28.2,28.14 1 6
30+
github.com/vfedoroff/leetcode/reverse-integer/main.go:31.2,31.10 1 4
31+
github.com/vfedoroff/leetcode/reverse-integer/main.go:17.14,19.3 1 2
32+
github.com/vfedoroff/leetcode/reverse-integer/main.go:20.13,24.3 3 22
33+
github.com/vfedoroff/leetcode/reverse-integer/main.go:25.23,27.3 1 1
34+
github.com/vfedoroff/leetcode/reverse-integer/main.go:28.14,30.3 1 2
35+
mode: atomic
36+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:10.29,14.12 4 18
37+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:17.2,17.36 1 16
38+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:27.2,29.6 3 14
39+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:47.2,48.19 2 12
40+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:51.2,51.19 1 11
41+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:54.2,54.21 1 10
42+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:14.12,16.3 1 2
43+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:17.36,18.20 1 9
44+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:21.3,23.12 3 9
45+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:18.20,20.4 1 8
46+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:23.12,25.4 1 2
47+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:29.6,32.12 3 75
48+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:35.3,37.22 3 70
49+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:43.3,43.13 1 68
50+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:32.12,33.9 1 5
51+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:37.22,38.18 1 2
52+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:41.4,41.17 1 1
53+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:38.18,40.5 1 1
54+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:43.13,44.9 1 7
55+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:48.19,50.3 1 1
56+
github.com/vfedoroff/leetcode/string-to-integer-atoi/main.go:51.19,53.3 1 1
57+
mode: atomic
58+
github.com/vfedoroff/leetcode/two-sum/main.go:3.43,5.25 2 1
59+
github.com/vfedoroff/leetcode/two-sum/main.go:13.2,13.22 1 0
60+
github.com/vfedoroff/leetcode/two-sum/main.go:5.25,8.9 3 2
61+
github.com/vfedoroff/leetcode/two-sum/main.go:11.3,11.11 1 1
62+
github.com/vfedoroff/leetcode/two-sum/main.go:8.9,10.4 1 1

string-to-integer-atoi/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,4 @@ func myAtoi(str string) int {
5353
}
5454
return prefix * num
5555
}
56+

0 commit comments

Comments
 (0)