Skip to content

Commit f4729cf

Browse files
committed
Add more tests
1 parent 3ddf199 commit f4729cf

File tree

3 files changed

+90
-19
lines changed

3 files changed

+90
-19
lines changed

src/avl.jl

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ end
2929

3030
AbstractTrees.nodevalue(node::AVLNode) = node.value
3131

32-
AbstractTrees.NodeType(::Type{<:AVLNode}) = HasNodeType()
32+
AbstractTrees.NodeType(::Type{<:AVLNode}) = AbstractTrees.HasNodeType()
3333
AbstractTrees.nodetype(T::Type{<:AVLNode}) = T
3434

3535
function AbstractTrees.printnode(io::IO, node::AVLNode)
@@ -109,9 +109,9 @@ function _insert!(root, key, value)
109109
elseif bf < -1 && key > root.right.key
110110
_leftrotate!(root)
111111
elseif bf > 1 && key > root.left.key
112-
_rightrotate!(root)
112+
_leftrightrotate!(root)
113113
elseif bf < -1 && key < root.right.key
114-
_leftrotate!(root)
114+
_rightleftrotate!(root)
115115
else
116116
root
117117
end
@@ -146,11 +146,9 @@ function _delete!(root, key)
146146
elseif bf < -1 && _balancefactor(root.right) 0
147147
_leftrotate!(root)
148148
elseif bf > 1 && _balancefactor(root.left) < 0
149-
root.left = _leftrotate!(root.left)
150-
_rightrotate!(root)
149+
_leftrightrotate!(root)
151150
elseif bf < -1 && _balancefactor(root.right) > 0
152-
root.right = _rightrotate!(root.right)
153-
_leftrotate!(root)
151+
_rightleftrotate!(root)
154152
else
155153
root
156154
end
@@ -182,6 +180,16 @@ function _rightrotate!(node)
182180
A
183181
end
184182

183+
function _leftrightrotate!(node)
184+
node.left = _leftrotate!(node.left)
185+
_rightrotate!(node)
186+
end
187+
188+
function _rightleftrotate!(node)
189+
node.right = _rightrotate!(node.right)
190+
_leftrotate!(node)
191+
end
192+
185193
function _updateheight!(node)
186194
node.height = 1 + max(_height(node.left), _height(node.right))
187195
node

test/Project.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
[deps]
2+
AbstractTrees = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
23
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"

test/runtests.jl

Lines changed: 74 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,109 @@
11
using TreeDataStructures
2+
using AbstractTrees
23
using Test
34

45
@testset "TreeDataStructures.jl" begin
56
@testset "AVLTree" begin
67
tree = AVLTree{Int,Int}()
7-
tree[1] = 10
88
tree[2] = 20
9+
tree[1] = 10
910
tree[3] = 30
10-
@test tree[1] == 10
1111
@test tree[2] == 20
12+
@test tree[1] == 10
1213
@test tree[3] == 30
1314

1415
# value conversion
1516
tree = AVLTree{Int,Float64}()
16-
tree[1] = 10
1717
tree[2] = 20
18+
tree[1] = 10
1819
tree[3] = 30
19-
@test tree[1] isa Float64
20-
@test tree[1] == 10.0
2120
@test tree[2] isa Float64
2221
@test tree[2] == 20.0
22+
@test tree[1] isa Float64
23+
@test tree[1] == 10.0
2324
@test tree[3] isa Float64
2425
@test tree[3] == 30.0
2526

2627
# tree that accept any types
2728
tree = AVLTree()
28-
tree[1] = 1.1
2929
tree[2] = 'A'
30+
tree[1] = 1.1
3031
tree[3] = "test"
31-
@test tree[1] == 1.1
3232
@test tree[2] == 'A'
33+
@test tree[1] == 1.1
3334
@test tree[3] == "test"
3435

35-
# show
36+
# AbstractTrees interface
37+
tree = AVLTree{Int,Int}()
38+
tree[3] = 30
39+
tree[2] = 20
40+
tree[4] = 40
41+
tree[1] = 10
42+
tree[5] = 50
43+
root = tree.root
44+
@test children(root) === (root.left, root.right)
45+
@test children(root.left) === (root.left.left,)
46+
@test children(root.right) === (root.right.right,)
47+
@test children(root.left.left) === ()
48+
@test children(root.right.right) === ()
49+
@test nodevalue(root) == 30
50+
@test nodevalue(root.left) == 20
51+
@test nodevalue(root.right) == 40
52+
@test nodevalue(root.left.left) == 10
53+
@test nodevalue(root.right.right) == 50
54+
@test NodeType(root) === HasNodeType()
55+
@test nodetype(root) === typeof(root)
56+
57+
# left rotate
3658
tree = AVLTree{Int,Int}()
37-
@test sprint(show, MIME("text/plain"), tree) == "AVLTree()"
3859
tree[1] = 10
3960
tree[2] = 20
4061
tree[3] = 30
62+
@test tree.root.key == 2
63+
@test tree.root.left.key == 1
64+
@test tree.root.right.key == 3
65+
66+
# right rotate
67+
tree = AVLTree{Int,Int}()
68+
tree[3] = 30
69+
tree[2] = 20
70+
tree[1] = 10
71+
@test tree.root.key == 2
72+
@test tree.root.left.key == 1
73+
@test tree.root.right.key == 3
74+
75+
# left-right rotate
76+
tree = AVLTree{Int,Int}()
77+
tree[3] = 30
78+
tree[1] = 10
79+
tree[2] = 20
80+
@test tree.root.key == 2
81+
@test tree.root.left.key == 1
82+
@test tree.root.right.key == 3
83+
84+
# right-left rotate
85+
tree = AVLTree{Int,Int}()
86+
tree[1] = 10
87+
tree[3] = 30
88+
tree[2] = 20
89+
@test tree.root.key == 2
90+
@test tree.root.left.key == 1
91+
@test tree.root.right.key == 3
92+
93+
# show
94+
tree = AVLTree{Int,Int}()
95+
@test sprint(show, MIME("text/plain"), tree) == "AVLTree()"
96+
tree[3] = 30
97+
tree[2] = 20
98+
tree[4] = 40
99+
tree[1] = 10
100+
tree[5] = 50
41101
@test sprint(show, MIME("text/plain"), tree) == """
42102
AVLTree
43-
2 => 20
44-
├─ 1 => 10
45-
└─ 3 => 30"""
103+
3 => 30
104+
├─ 2 => 20
105+
│ └─ 1 => 10
106+
└─ 4 => 40
107+
└─ 5 => 50"""
46108
end
47109
end

0 commit comments

Comments
 (0)