1
1
package bstree
2
2
3
3
import (
4
+ "errors"
4
5
"fmt"
6
+
7
+ "golang.org/x/exp/constraints"
5
8
)
6
9
7
10
// BSTree represents a binary tree
8
- type BSTree struct {
9
- Root * Node
10
- }
11
-
12
- // New returns a pointer to a new binary tree
13
- func New () * BSTree {
14
- return & BSTree {}
11
+ type BSTree [K constraints.Ordered , V any ] struct {
12
+ Root * Node [K , V ]
15
13
}
16
14
17
15
// IsEmpty checks if the BSTree is empty
18
- func (tree * BSTree ) IsEmpty () bool {
16
+ func (tree * BSTree [ K , V ] ) IsEmpty () bool {
19
17
return tree .Root == nil
20
18
}
21
19
22
20
// Size returns the size of the tree
23
- func (tree * BSTree ) Size () int {
21
+ func (tree * BSTree [ K , V ] ) Size () int {
24
22
return tree .Root .Size ()
25
23
}
26
24
27
25
// Height returns the height of the tree
28
- func (tree * BSTree ) Height () int {
26
+ func (tree * BSTree [ K , V ] ) Height () int {
29
27
return height (tree .Root )
30
28
}
31
29
32
- func height (node * Node ) int {
30
+ func height [ K constraints. Ordered , V any ] (node * Node [ K , V ] ) int {
33
31
if node == nil {
34
32
return 0
35
33
}
@@ -47,76 +45,77 @@ func height(node *Node) int {
47
45
}
48
46
49
47
// Put the item to the node
50
- func (tree * BSTree ) Put (item Item ) {
51
- tree .Root = put (tree .Root , item )
48
+ func (tree * BSTree [K , V ]) Put (key K , val V ) {
49
+ tree .Root = put (tree .Root , key , val )
50
+
52
51
}
53
52
54
- func put (node * Node , item Item ) * Node {
53
+ func put [ K constraints. Ordered , V any ] (node * Node [ K , V ], key K , val V ) * Node [ K , V ] {
55
54
if node == nil {
56
- return & Node { item : item , size : 1 }
55
+ return & Node [ K , V ]{ key : key , value : val , size : 1 }
57
56
}
58
57
59
- if item . LessThan ( node .item ) {
60
- node .left = put (node .left , item )
61
- } else if item . MoreThan ( node .item ) {
62
- node .right = put (node .right , item )
58
+ if key < node .key {
59
+ node .left = put (node .left , key , val )
60
+ } else if key > node .key {
61
+ node .right = put (node .right , key , val )
63
62
} else {
64
- node .item = item
63
+ node .value = val
65
64
}
66
65
67
66
node .size = 1 + node .left .Size () + node .right .Size ()
68
67
return node
69
68
}
70
69
71
70
// Find search for an item in the tree
72
- func (tree * BSTree ) Find ( item Item ) (Item , bool ) {
73
- return find (tree .Root , item )
71
+ func (tree * BSTree [ K , V ]) Get ( key K ) (V , bool ) {
72
+ return get (tree .Root , key )
74
73
}
75
74
76
- func find (node * Node , item Item ) (Item , bool ) {
75
+ func get [ K constraints. Ordered , V any ] (node * Node [ K , V ], key K ) (V , bool ) {
77
76
if node == nil {
78
- return nil , false
77
+ return * new ( V ) , false
79
78
}
80
79
81
- if item . LessThan ( node .item ) {
82
- return find (node .left , item )
83
- } else if item . MoreThan ( node .item ) {
84
- return find (node .right , item )
80
+ if key < node .key {
81
+ return get (node .left , key )
82
+ } else if key > node .key {
83
+ return get (node .right , key )
85
84
} else {
86
- return node .item , true
85
+ return node .value , true
87
86
}
88
87
}
89
88
90
- // Min returns the min item of the tree
91
- func (tree * BSTree ) Min () (Item , bool ) {
89
+ // Min returns the smallest key in the table
90
+ func (tree * BSTree [ K , V ] ) Min () (K , error ) {
92
91
if tree .IsEmpty () {
93
- return nil , false
92
+ return * new ( K ), errors . New ( "calls min() on empty tree" )
94
93
}
95
94
96
- node , found := min (tree .Root )
95
+ node := min (tree .Root )
97
96
98
- return node .item , found
97
+ return node .key , nil
99
98
}
100
99
101
- func min (node * Node ) ( * Node , bool ) {
100
+ func min [ K constraints. Ordered , V any ] (node * Node [ K , V ]) * Node [ K , V ] {
102
101
if (node .left ) == nil {
103
- return node , true
102
+ return node
104
103
}
105
104
106
105
return min (node .left )
107
106
}
108
107
109
- // DeleteMin deletes the min item of the tree
110
- func (tree * BSTree ) DeleteMin () bool {
108
+ // DeleteMin deletes the smallest key and associated value from the table.
109
+ func (tree * BSTree [ K , V ] ) DeleteMin () error {
111
110
if tree .IsEmpty () {
112
- return false
111
+ return errors . New ( "Symbol table is empty" )
113
112
}
114
113
115
114
tree .Root = deleteMin (tree .Root )
116
- return true
115
+ return nil
117
116
}
118
117
119
- func deleteMin (node * Node ) * Node {
118
+ func deleteMin [ K constraints. Ordered , V any ] (node * Node [ K , V ] ) * Node [ K , V ] {
120
119
if node .left == nil {
121
120
return node .right
122
121
}
@@ -127,20 +126,20 @@ func deleteMin(node *Node) *Node {
127
126
return node
128
127
}
129
128
130
- // Delete an item from the tree
131
- func (tree * BSTree ) Delete (item Item ) {
132
- tree .Root = delete (tree .Root , item )
129
+ // Removes the specified key and its associated value from this symbol table
130
+ func (tree * BSTree [ K , V ] ) Delete (key K ) {
131
+ tree .Root = delete (tree .Root , key )
133
132
}
134
133
135
- func delete (node * Node , item Item ) * Node {
134
+ func delete [ K constraints. Ordered , V any ] (node * Node [ K , V ], key K ) * Node [ K , V ] {
136
135
if node == nil {
137
136
return nil
138
137
}
139
138
140
- if item . LessThan ( node .item ) {
141
- node .left = delete (node .left , item )
142
- } else if item . MoreThan ( node .item ) {
143
- node .right = delete (node .right , item )
139
+ if key < node .key {
140
+ node .left = delete (node .left , key )
141
+ } else if key > node .key {
142
+ node .right = delete (node .right , key )
144
143
} else {
145
144
146
145
if node .right == nil {
@@ -152,7 +151,7 @@ func delete(node *Node, item Item) *Node {
152
151
}
153
152
154
153
t := node
155
- node , _ = min (t .right )
154
+ node = min (t .right )
156
155
node .right = deleteMin (t .right )
157
156
node .left = t .left
158
157
}
@@ -163,18 +162,18 @@ func delete(node *Node, item Item) *Node {
163
162
}
164
163
165
164
// InOrderPrint traversal of the tree
166
- func (tree * BSTree ) InOrderPrint () {
165
+ func (tree * BSTree [ K , V ] ) InOrderPrint () {
167
166
inOrder (tree .Root )
168
167
}
169
168
170
- func inOrder (node * Node ) {
169
+ func inOrder [ K constraints. Ordered , V any ] (node * Node [ K , V ] ) {
171
170
if node != nil {
172
171
inOrder (node .left )
173
- fmt .Printf ("%v " , node .item )
172
+ fmt .Printf ("%v " , node .value )
174
173
inOrder (node .right )
175
174
}
176
175
}
177
176
178
- func (tree * BSTree ) String () string {
177
+ func (tree * BSTree [ K , V ] ) String () string {
179
178
return fmt .Sprintf ("%v" , tree .Root )
180
179
}
0 commit comments