@@ -2,6 +2,7 @@ package binarysearchtree
22
33import (
44 "cmp"
5+ "errors"
56
67 "github.com/fgm/container"
78)
@@ -68,43 +69,64 @@ func (n *node[E]) upsert(m *node[E]) *E {
6869 }
6970}
7071
71- func (n * node [E ]) walkInOrder (cb container.WalkCB [E ]) {
72+ func (n * node [E ]) walkInOrder (cb container.WalkCB [E ]) error {
73+ var err error
7274 if n == nil {
73- return
75+ return nil
7476 }
7577 if n .left != nil {
76- n .left .walkInOrder (cb )
78+ if err = n .left .walkInOrder (cb ); err != nil {
79+ return err
80+ }
81+ }
82+ if err := cb (n .data ); err != nil {
83+ return err
7784 }
78- cb (n .data )
7985 if n .right != nil {
80- n .right .walkInOrder (cb )
86+ if err = n .right .walkInOrder (cb ); err != nil {
87+ return err
88+ }
8189 }
90+ return nil
8291}
8392
84- func (n * node [E ]) walkPostOrder (cb container.WalkCB [E ]) {
93+ func (n * node [E ]) walkPostOrder (cb container.WalkCB [E ]) error {
94+ var err error
8595 if n == nil {
86- return
96+ return nil
8797 }
8898 if n .left != nil {
89- n .left .walkPostOrder (cb )
99+ if err = n .left .walkPostOrder (cb ); err != nil {
100+ return err
101+ }
90102 }
91103 if n .right != nil {
92- n .right .walkPostOrder (cb )
104+ if err = n .right .walkPostOrder (cb ); err != nil {
105+ return err
106+ }
93107 }
94- cb (n .data )
108+ return cb (n .data )
95109}
96110
97- func (n * node [E ]) walkPreOrder (cb container.WalkCB [E ]) {
111+ func (n * node [E ]) walkPreOrder (cb container.WalkCB [E ]) error {
112+ var err error
98113 if n == nil {
99- return
114+ return nil
115+ }
116+ if err := cb (n .data ); err != nil {
117+ return err
100118 }
101- cb (n .data )
102119 if n .left != nil {
103- n .left .walkPreOrder (cb )
120+ if err = n .left .walkPreOrder (cb ); err != nil {
121+ return err
122+ }
104123 }
105124 if n .right != nil {
106- n .right .walkPreOrder (cb )
125+ if err = n .right .walkPreOrder (cb ); err != nil {
126+ return err
127+ }
107128 }
129+ return nil
108130}
109131
110132// Intrinsic holds nodes which are their own ordering key.
@@ -116,13 +138,13 @@ type Intrinsic[E cmp.Ordered] struct {
116138// Complexity is O(n).
117139func (t * Intrinsic [E ]) Len () int {
118140 l := 0
119- t .WalkPostOrder (func (_ * E ) { l ++ })
141+ t .WalkPostOrder (func (_ * E ) error { l ++ ; return nil })
120142 return l
121143}
122144
123145func (t * Intrinsic [E ]) Elements () []E {
124146 var sl []E
125- t .WalkPreOrder (func (e * E ) { sl = append (sl , * e ) })
147+ t .WalkPreOrder (func (e * E ) error { sl = append (sl , * e ); return nil })
126148 return sl
127149}
128150
@@ -159,49 +181,50 @@ func (t *Intrinsic[E]) Delete(e *E) {
159181// If the value cannot be found, it will return 0, false, otherwise the position
160182// starting at 0, and true.
161183func (t * Intrinsic [E ]) IndexOf (e * E ) (int , bool ) {
162- index , found := 0 , false
163- t .WalkInOrder (func (x * E ) {
184+ errFound := errors .New ("found" )
185+ index := 0
186+ err := t .WalkInOrder (func (x * E ) error {
164187 if * x == * e {
165- found = true
166- }
167- if ! found {
168- index ++
188+ return errFound
169189 }
190+ index ++
191+ return nil
170192 })
171- if ! found {
172- index = 0
193+ if err != errFound {
194+ return 0 , false
173195 }
174- return index , found
196+ return index , true
175197}
176198
177199// WalkInOrder is useful for search and listing nodes in order.
178- func (t * Intrinsic [E ]) WalkInOrder (cb container.WalkCB [E ]) {
200+ func (t * Intrinsic [E ]) WalkInOrder (cb container.WalkCB [E ]) error {
179201 if t == nil {
180- return
202+ return nil
181203 }
182- t .root .walkInOrder (cb )
204+ return t .root .walkInOrder (cb )
183205}
184206
185207// WalkPostOrder in useful for deleting subtrees.
186- func (t * Intrinsic [E ]) WalkPostOrder (cb container.WalkCB [E ]) {
208+ func (t * Intrinsic [E ]) WalkPostOrder (cb container.WalkCB [E ]) error {
187209 if t == nil {
188- return
210+ return nil
189211 }
190- t .root .walkPostOrder (cb )
212+ return t .root .walkPostOrder (cb )
191213}
192214
193215// WalkPreOrder is useful to clone the tree.
194- func (t * Intrinsic [E ]) WalkPreOrder (cb container.WalkCB [E ]) {
216+ func (t * Intrinsic [E ]) WalkPreOrder (cb container.WalkCB [E ]) error {
195217 if t == nil {
196- return
218+ return nil
197219 }
198- t .root .walkPreOrder (cb )
220+ return t .root .walkPreOrder (cb )
199221}
200222
201223func (t * Intrinsic [E ]) Clone () container.BinarySearchTree [E ] {
202224 clone := & Intrinsic [E ]{}
203- t .WalkPreOrder (func (e * E ) {
225+ t .WalkPreOrder (func (e * E ) error {
204226 clone .Upsert (e )
227+ return nil
205228 })
206229 return clone
207230}
0 commit comments