Skip to content

Commit 4da8040

Browse files
committed
add search_key, add tests
1 parent 01fdb77 commit 4da8040

File tree

4 files changed

+95
-5
lines changed

4 files changed

+95
-5
lines changed

src/DataStructures.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,9 @@ module DataStructures
110110
export SparseIntSet
111111

112112
include("dibit_vector.jl")
113+
include("avl_tree.jl")
113114
include("red_black_tree.jl")
115+
114116
include("deprecations.jl")
115117

116118
end

src/avl_tree.jl

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
mutable struct AVLTreeNode{K}
22
height::Int8
3-
data::K
43
leftChild::Union{AVLTreeNode{K}, Nothing}
54
rightChild::Union{AVLTreeNode{K}, Nothing}
5+
data::K
66

7-
AVLTreeNode{K}() where K = new{K}(0, nothing, nothing, nothing)
8-
AVLTreeNode{K}(d::K) where K = new{K}(1, d, nothing, nothing)
7+
AVLTreeNode{K}() where K = new{K}(0, nothing, nothing)
8+
AVLTreeNode{K}(d::K) where K = new{K}(1, nothing, nothing, d)
99
end
1010

1111
AVLTreeNode(d) = AVLTreeNode{Any}(d)
@@ -15,7 +15,7 @@ AVLTreeNode_or_null{T} = Union{AVLTreeNode{T}, Nothing}
1515
mutable struct AVLTree{T}
1616
root::AVLTreeNode_or_null{T}
1717

18-
AVLTree{T}() where T = new{T}(AVLTreeNode{T}())
18+
AVLTree{T}() where T = new{T}(nothing)
1919
end
2020

2121
AVLTree() = AVLTree{Any}()
@@ -65,6 +65,27 @@ function get_minimum_node(node::Union{AVLTreeNode, Nothing})
6565
return node
6666
end
6767

68+
function search_node(tree::AVLTree{K}, d::K) where K
69+
prev = nothing
70+
node = tree.root
71+
while node != nothing && node.data != nothing && node.data != d
72+
prev = node
73+
if d < node.data
74+
node = node.leftChild
75+
else
76+
node = node.rightChild
77+
end
78+
end
79+
80+
return (node == nothing) ? prev : node
81+
end
82+
83+
function search_key(tree::AVLTree{K}, d::K) where K
84+
(tree.root == nothing) && return false
85+
node = search_node(tree, d)
86+
return (node.data == d)
87+
end
88+
6889
function Base.insert!(tree::AVLTree{K}, d::K) where K
6990

7091
function insert_node(node::Union{AVLTreeNode, Nothing}, key)
@@ -99,6 +120,9 @@ function Base.insert!(tree::AVLTree{K}, d::K) where K
99120

100121
return node
101122
end
123+
124+
search_key(tree, d) && return tree
125+
102126
tree.root = insert_node(tree.root, d)
103127
return tree
104128
end
@@ -156,6 +180,8 @@ function Base.delete!(tree::AVLTree{K}, d::K) where K
156180
return node
157181
end
158182

183+
!search_key(tree, d) && throw(KeyError(d))
184+
159185
tree.root = delete_node(tree.root, d)
160186
return tree
161187
end

test/runtests.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ tests = ["deprecations",
3131
"fenwick",
3232
"robin_dict",
3333
"dibit_vector",
34-
"red_black_tree"
34+
"red_black_tree",
35+
"avl_tree",
3536
]
3637

3738
if length(ARGS) > 0

test/test_avl_tree.jl

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
include("../src/avl_tree.jl")
2+
@testset "AVLTree" begin
3+
t = AVLTree()
4+
for i = 1:10000
5+
insert!(t, i)
6+
end
7+
for i = 1:10000
8+
@test search_key(t, i)
9+
end
10+
11+
for i = 10001:20000
12+
@test !search_key(t, i)
13+
end
14+
15+
for i = 1:2:10000
16+
delete!(t, i)
17+
end
18+
19+
for i = 1:10000
20+
if iseven(i)
21+
@test search_key(t, i)
22+
else
23+
@test !search_key(t, i)
24+
@test_throws KeyError delete!(t, i)
25+
end
26+
end
27+
28+
for i = 1:2:1000
29+
insert!(t, i)
30+
end
31+
32+
for i = 1:1000
33+
@test search_key(t, i)
34+
end
35+
36+
# for handling cases related to delete!
37+
t2 = AVLTree{Int}()
38+
for i = 1:100000
39+
insert!(t2, i)
40+
end
41+
42+
nums = rand(1:100000, 1000)
43+
visited = Set{Int}()
44+
for num in nums
45+
if num in visited
46+
@test_throws KeyError delete!(t2, num)
47+
else
48+
delete!(t2, num)
49+
push!(visited, num)
50+
end
51+
end
52+
53+
for i = 1:100000
54+
if i in visited
55+
@test !search_key(t2, i)
56+
else
57+
@test search_key(t2, i)
58+
end
59+
end
60+
61+
end

0 commit comments

Comments
 (0)