Skip to content

Commit a91ef21

Browse files
Change binary tree traversal implementation and add the test (#360)
* add btree test file * change binary tree traversal implementation and add btree traversal test Co-authored-by: Rak Laptudirm <[email protected]>
1 parent adc50eb commit a91ef21

File tree

2 files changed

+131
-21
lines changed

2 files changed

+131
-21
lines changed

structure/binarytree/btree.go

Lines changed: 43 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package binarytree
22

3-
import "fmt"
4-
53
// BTree Returns a binary tree structure which contains only a root Node
64
type BTree struct {
75
Root *Node
@@ -33,15 +31,6 @@ func (t *BTree) Depth() int {
3331
return calculateDepth(t.Root, 0)
3432
}
3533

36-
// InOrder add's children to a node in order left first then right recursively
37-
func InOrder(n *Node) {
38-
if n != nil {
39-
InOrder(n.left)
40-
fmt.Print(n.val, " ")
41-
InOrder(n.right)
42-
}
43-
}
44-
4534
// InOrderSuccessor Goes to the left
4635
func InOrderSuccessor(root *Node) *Node {
4736
cur := root
@@ -77,36 +66,63 @@ func BstDelete(root *Node, val int) *Node {
7766
return root
7867
}
7968

69+
// InOrder add's children to a node in order left first then right recursively
70+
func inOrderRecursive(n *Node, traversal *[]int) {
71+
if n != nil {
72+
inOrderRecursive(n.left, traversal)
73+
*traversal = append(*traversal, n.val)
74+
inOrderRecursive(n.right, traversal)
75+
}
76+
}
77+
78+
func InOrder(root *Node) []int {
79+
traversal := make([]int, 0)
80+
inOrderRecursive(root, &traversal)
81+
return traversal
82+
}
83+
8084
// PreOrder Preorder
81-
func PreOrder(n *Node) {
85+
func preOrderRecursive(n *Node, traversal *[]int) {
8286
if n == nil {
8387
return
8488
}
85-
fmt.Print(n.val, " ")
86-
PreOrder(n.left)
87-
PreOrder(n.right)
89+
*traversal = append(*traversal, n.val)
90+
preOrderRecursive(n.left, traversal)
91+
preOrderRecursive(n.right, traversal)
92+
}
93+
94+
func PreOrder(root *Node) []int {
95+
traversal := make([]int, 0)
96+
preOrderRecursive(root, &traversal)
97+
return traversal
8898
}
8999

90100
// PostOrder PostOrder
91-
func PostOrder(n *Node) {
101+
func postOrderRecursive(n *Node, traversal *[]int) {
92102
if n == nil {
93103
return
94104
}
95-
PostOrder(n.left)
96-
PostOrder(n.right)
97-
fmt.Print(n.val, " ")
105+
postOrderRecursive(n.left, traversal)
106+
postOrderRecursive(n.right, traversal)
107+
*traversal = append(*traversal, n.val)
108+
}
109+
110+
func PostOrder(root *Node) []int {
111+
traversal := make([]int, 0)
112+
postOrderRecursive(root, &traversal)
113+
return traversal
98114
}
99115

100116
// LevelOrder LevelOrder
101-
func LevelOrder(root *Node) {
117+
func levelOrderRecursive(root *Node, traversal *[]int) {
102118
var q []*Node // queue
103119
var n *Node // temporary node
104120

105121
q = append(q, root)
106122

107123
for len(q) != 0 {
108124
n, q = q[0], q[1:]
109-
fmt.Print(n.val, " ")
125+
*traversal = append(*traversal, n.val)
110126
if n.left != nil {
111127
q = append(q, n.left)
112128
}
@@ -116,6 +132,12 @@ func LevelOrder(root *Node) {
116132
}
117133
}
118134

135+
func LevelOrder(root *Node) []int {
136+
traversal := make([]int, 0)
137+
levelOrderRecursive(root, &traversal)
138+
return traversal
139+
}
140+
119141
// AccessNodesByLayer Function that access nodes layer by layer instead of printing the results as one line.
120142
func AccessNodesByLayer(root *Node) [][]int {
121143
var res [][]int

structure/binarytree/btree_test.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,94 @@ func TestDelete(t *testing.T) {
124124
})
125125
}
126126

127+
func TestInOrder(t *testing.T) {
128+
BTree := BTree{
129+
Root: NewNode(90),
130+
}
131+
132+
root := BTree.Root
133+
134+
Insert(root, 80)
135+
Insert(root, 100)
136+
Insert(root, 70)
137+
Insert(root, 85)
138+
Insert(root, 95)
139+
Insert(root, 105)
140+
141+
a := InOrder(root)
142+
b := []int{70, 80, 85, 90, 95, 100, 105}
143+
144+
if !reflect.DeepEqual(a, b) {
145+
t.Errorf("Nodes should have value = [70 80 85 90 95 100 105]")
146+
}
147+
}
148+
149+
func TestPreOrder(t *testing.T) {
150+
BTree := BTree{
151+
Root: NewNode(90),
152+
}
153+
154+
root := BTree.Root
155+
156+
Insert(root, 80)
157+
Insert(root, 100)
158+
Insert(root, 70)
159+
Insert(root, 85)
160+
Insert(root, 95)
161+
Insert(root, 105)
162+
163+
a := PreOrder(root)
164+
b := []int{90, 80, 70, 85, 100, 95, 105}
165+
166+
if !reflect.DeepEqual(a, b) {
167+
t.Errorf("Nodes should have value = [90 80 70 85 100 95 105]")
168+
}
169+
}
170+
171+
func TestPostOrder(t *testing.T) {
172+
BTree := BTree{
173+
Root: NewNode(90),
174+
}
175+
176+
root := BTree.Root
177+
178+
Insert(root, 80)
179+
Insert(root, 100)
180+
Insert(root, 70)
181+
Insert(root, 85)
182+
Insert(root, 95)
183+
Insert(root, 105)
184+
185+
a := PostOrder(root)
186+
b := []int{70, 85, 80, 95, 105, 100, 90}
187+
188+
if !reflect.DeepEqual(a, b) {
189+
t.Errorf("Nodes should have value = [70 85 80 95 105 100 90]")
190+
}
191+
}
192+
193+
func TestLevelOrder(t *testing.T) {
194+
BTree := BTree{
195+
Root: NewNode(90),
196+
}
197+
198+
root := BTree.Root
199+
200+
Insert(root, 80)
201+
Insert(root, 100)
202+
Insert(root, 70)
203+
Insert(root, 85)
204+
Insert(root, 95)
205+
Insert(root, 105)
206+
207+
a := LevelOrder(root)
208+
b := []int{90, 80, 100, 70, 85, 95, 105}
209+
210+
if !reflect.DeepEqual(a, b) {
211+
t.Errorf("Nodes should have value = [90 80 100 70 85 95 105]")
212+
}
213+
}
214+
127215
func TestAccessNodesByLayer(t *testing.T) {
128216
BTree := BTree{
129217
Root: NewNode(90),

0 commit comments

Comments
 (0)