@@ -6,26 +6,24 @@ const BT = BinaryTrees
6
6
7
7
@testset " BT.jl" begin
8
8
@testset " AVLTree" begin
9
- # insert
9
+ # internal node conversion
10
+ node1 = BT. AVLNode (1 , 2 )
11
+ node2 = convert (BT. AVLNode{Float64,Float64}, node1)
12
+ @test node2 isa BT. AVLNode{Float64,Float64}
13
+ @test BT. key (node2) == 1.0
14
+ @test BT. value (node2) == 2.0
15
+ node3 = convert (typeof (node1), node1)
16
+ @test node3 === node1
17
+
18
+ # insert & search
10
19
tree = AVLTree {Int,Int} ()
11
20
BT. insert! (tree, 2 , 20 )
12
21
BT. insert! (tree, 1 , 10 )
13
22
BT. insert! (tree, 3 , 30 )
14
23
@test BT. value (BT. search (tree, 2 )) == 20
15
24
@test BT. value (BT. search (tree, 1 )) == 10
16
25
@test BT. value (BT. search (tree, 3 )) == 30
17
-
18
- # value conversion
19
- tree = AVLTree {Int,Float64} ()
20
- BT. insert! (tree, 2 , 20 )
21
- BT. insert! (tree, 1 , 10 )
22
- BT. insert! (tree, 3 , 30 )
23
- @test BT. value (BT. search (tree, 2 )) isa Float64
24
- @test BT. value (BT. search (tree, 2 )) == 20.0
25
- @test BT. value (BT. search (tree, 1 )) isa Float64
26
- @test BT. value (BT. search (tree, 1 )) == 10.0
27
- @test BT. value (BT. search (tree, 3 )) isa Float64
28
- @test BT. value (BT. search (tree, 3 )) == 30.0
26
+ @test isnothing (BT. search (tree, 4 ))
29
27
30
28
# update values
31
29
tree = AVLTree {Int,Int} ()
@@ -42,7 +40,19 @@ const BT = BinaryTrees
42
40
@test BT. value (BT. search (tree, 1 )) == 11
43
41
@test BT. value (BT. search (tree, 3 )) == 33
44
42
45
- # right rotate
43
+ # value conversion
44
+ tree = AVLTree {Int,Float64} ()
45
+ BT. insert! (tree, 2 , 20 )
46
+ BT. insert! (tree, 1 , 10 )
47
+ BT. insert! (tree, 3 , 30 )
48
+ @test BT. value (BT. search (tree, 2 )) isa Float64
49
+ @test BT. value (BT. search (tree, 2 )) == 20.0
50
+ @test BT. value (BT. search (tree, 1 )) isa Float64
51
+ @test BT. value (BT. search (tree, 1 )) == 10.0
52
+ @test BT. value (BT. search (tree, 3 )) isa Float64
53
+ @test BT. value (BT. search (tree, 3 )) == 30.0
54
+
55
+ # insert: right rotate
46
56
tree = AVLTree {Int,Int} ()
47
57
BT. insert! (tree, 3 , 30 )
48
58
BT. insert! (tree, 2 , 20 )
@@ -51,7 +61,7 @@ const BT = BinaryTrees
51
61
@test tree |> BT. root |> BT. left |> BT. key == 1
52
62
@test tree |> BT. root |> BT. right |> BT. key == 3
53
63
54
- # left rotate
64
+ # insert: left rotate
55
65
tree = AVLTree {Int,Int} ()
56
66
BT. insert! (tree, 1 , 10 )
57
67
BT. insert! (tree, 2 , 20 )
@@ -60,7 +70,7 @@ const BT = BinaryTrees
60
70
@test tree |> BT. root |> BT. left |> BT. key == 1
61
71
@test tree |> BT. root |> BT. right |> BT. key == 3
62
72
63
- # left-right rotate
73
+ # insert: left-right rotate
64
74
tree = AVLTree {Int,Int} ()
65
75
BT. insert! (tree, 3 , 30 )
66
76
BT. insert! (tree, 1 , 10 )
@@ -69,7 +79,7 @@ const BT = BinaryTrees
69
79
@test tree |> BT. root |> BT. left |> BT. key == 1
70
80
@test tree |> BT. root |> BT. right |> BT. key == 3
71
81
72
- # right-left rotate
82
+ # insert: right-left rotate
73
83
tree = AVLTree {Int,Int} ()
74
84
BT. insert! (tree, 1 , 10 )
75
85
BT. insert! (tree, 3 , 30 )
@@ -98,7 +108,7 @@ const BT = BinaryTrees
98
108
BT. delete! (tree, 2 )
99
109
@test isnothing (BT. root (tree))
100
110
101
- # right rotate
111
+ # delete: right rotate
102
112
tree = AVLTree {Int,Int} ()
103
113
BT. insert! (tree, 3 , 30 )
104
114
BT. insert! (tree, 2 , 20 )
@@ -109,7 +119,7 @@ const BT = BinaryTrees
109
119
@test tree |> BT. root |> BT. left |> BT. key == 1
110
120
@test tree |> BT. root |> BT. right |> BT. key == 3
111
121
112
- # left rotate
122
+ # delete: left rotate
113
123
tree = AVLTree {Int,Int} ()
114
124
BT. insert! (tree, 1 , 10 )
115
125
BT. insert! (tree, - 10 , 0 )
@@ -120,7 +130,7 @@ const BT = BinaryTrees
120
130
@test tree |> BT. root |> BT. left |> BT. key == 1
121
131
@test tree |> BT. root |> BT. right |> BT. key == 3
122
132
123
- # left-right rotate
133
+ # delete: left-right rotate
124
134
tree = AVLTree {Int,Int} ()
125
135
BT. insert! (tree, 3 , 30 )
126
136
BT. insert! (tree, 1 , 10 )
@@ -131,7 +141,7 @@ const BT = BinaryTrees
131
141
@test tree |> BT. root |> BT. left |> BT. key == 1
132
142
@test tree |> BT. root |> BT. right |> BT. key == 3
133
143
134
- # right-left rotate
144
+ # delete: right-left rotate
135
145
tree = AVLTree {Int,Int} ()
136
146
BT. insert! (tree, 1 , 10 )
137
147
BT. insert! (tree, - 10 , 0 )
@@ -193,6 +203,64 @@ const BT = BinaryTrees
193
203
BT. delete! (tree, 2 )
194
204
@test isnothing (BT. root (tree))
195
205
206
+ # tree with keys that implement ordering relations
207
+ tree = AVLTree {String,Int} ()
208
+ BT. insert! (tree, " key2" , 2 )
209
+ BT. insert! (tree, " key1" , 1 )
210
+ BT. insert! (tree, " key3" , 3 )
211
+ @test BT. value (BT. search (tree, " key2" )) == 2
212
+ @test BT. value (BT. search (tree, " key1" )) == 1
213
+ @test BT. value (BT. search (tree, " key3" )) == 3
214
+ tree = AVLTree {NTuple{3,Int},Int} ()
215
+ BT. insert! (tree, (0 , 1 , 0 ), 2 )
216
+ BT. insert! (tree, (0 , 0 , 1 ), 1 )
217
+ BT. insert! (tree, (1 , 0 , 0 ), 3 )
218
+ @test BT. value (BT. search (tree, (0 , 1 , 0 ))) == 2
219
+ @test BT. value (BT. search (tree, (0 , 0 , 1 ))) == 1
220
+ @test BT. value (BT. search (tree, (1 , 0 , 0 ))) == 3
221
+
222
+ # type stability
223
+ tree = AVLTree {Int,Int} ()
224
+ @inferred BT. insert! (tree, 2 , 20 )
225
+ @inferred BT. insert! (tree, 1 , 10 )
226
+ @inferred BT. insert! (tree, 3 , 30 )
227
+ @inferred Nothing BT. search (tree, 2 )
228
+ @inferred Nothing BT. search (tree, 1 )
229
+ @inferred Nothing BT. search (tree, 3 )
230
+ @inferred BT. delete! (tree, 2 )
231
+ @inferred BT. delete! (tree, 1 )
232
+ @inferred BT. delete! (tree, 3 )
233
+ tree = AVLTree {Int} ()
234
+ @inferred BT. insert! (tree, 2 )
235
+ @inferred BT. insert! (tree, 1 )
236
+ @inferred BT. insert! (tree, 3 )
237
+ @inferred Nothing BT. search (tree, 2 )
238
+ @inferred Nothing BT. search (tree, 1 )
239
+ @inferred Nothing BT. search (tree, 3 )
240
+ @inferred BT. delete! (tree, 2 )
241
+ @inferred BT. delete! (tree, 1 )
242
+ @inferred BT. delete! (tree, 3 )
243
+ tree = AVLTree {String,Int} ()
244
+ @inferred BT. insert! (tree, " key2" , 2 )
245
+ @inferred BT. insert! (tree, " key1" , 1 )
246
+ @inferred BT. insert! (tree, " key3" , 3 )
247
+ @inferred Nothing BT. search (tree, " key2" )
248
+ @inferred Nothing BT. search (tree, " key1" )
249
+ @inferred Nothing BT. search (tree, " key3" )
250
+ @inferred BT. delete! (tree, " key2" )
251
+ @inferred BT. delete! (tree, " key1" )
252
+ @inferred BT. delete! (tree, " key3" )
253
+ tree = AVLTree {NTuple{3,Int},Int} ()
254
+ @inferred BT. insert! (tree, (0 , 1 , 0 ), 2 )
255
+ @inferred BT. insert! (tree, (0 , 0 , 1 ), 1 )
256
+ @inferred BT. insert! (tree, (1 , 0 , 0 ), 3 )
257
+ @inferred Nothing BT. search (tree, (0 , 1 , 0 ))
258
+ @inferred Nothing BT. search (tree, (0 , 0 , 1 ))
259
+ @inferred Nothing BT. search (tree, (1 , 0 , 0 ))
260
+ @inferred BT. delete! (tree, (0 , 1 , 0 ))
261
+ @inferred BT. delete! (tree, (0 , 0 , 1 ))
262
+ @inferred BT. delete! (tree, (1 , 0 , 0 ))
263
+
196
264
# AbstractTrees interface
197
265
tree = AVLTree {Int,Int} ()
198
266
BT. insert! (tree, 3 , 30 )
0 commit comments