14
14
15
15
AVLTreeNode (d) = AVLTreeNode {Any} (d)
16
16
17
+ Base. setproperty! (x:: AVLTreeNode{T} , f:: Symbol , v) where {T} =
18
+ setfield! (x, f, v)
19
+
17
20
AVLTreeNode_or_null{T} = Union{AVLTreeNode{T}, Nothing}
18
21
19
22
mutable struct AVLTree{T}
@@ -27,7 +30,7 @@ AVLTree() = AVLTree{Any}()
27
30
28
31
Base. length (tree:: AVLTree ) = tree. count
29
32
30
- get_height (node:: Union{AVLTreeNode, Nothing} ) = (node == nothing ) ? 0 : node. height
33
+ get_height (node:: Union{AVLTreeNode, Nothing} ) = (node == nothing ) ? Int8 ( 0 ) : node. height
31
34
32
35
# balance is the difference of height between leftChild and rightChild of a node.
33
36
function get_balance (node:: Union{AVLTreeNode, Nothing} )
40
43
41
44
# computes the height of the subtree, which basically is
42
45
# one added the maximum of the height of the left subtree and right subtree
43
- compute_height (node:: AVLTreeNode ) = 1 + max (get_height (node. leftChild), get_height (node. rightChild))
46
+ compute_height (node:: AVLTreeNode ) = Int8 ( 1 ) + max (get_height (node. leftChild), get_height (node. rightChild))
44
47
45
- get_subsize (node:: AVLTreeNode_or_null ) = (node == nothing ) ? 0 : node. subsize
48
+ get_subsize (node:: AVLTreeNode_or_null ) = (node == nothing ) ? Int32 ( 0 ) : node. subsize
46
49
47
50
# compute the subtree size
48
51
function compute_subtree_size (node:: AVLTreeNode_or_null )
49
52
if node == nothing
50
- return 0
53
+ return Int32 ( 0 )
51
54
else
52
55
L = get_subsize (node. leftChild)
53
56
R = get_subsize (node. rightChild)
54
- return (L + R + 1 )
57
+ return (L + R + Int32 ( 1 ) )
55
58
end
56
59
end
57
60
58
61
"""
59
62
left_rotate(node_x::AVLTreeNode)
60
63
61
- Performs a left-rotation on `node_x`, updates height of the nodes, and returns the rotated node.
64
+ Performs a left-rotation on `node_x`, updates height of the nodes, and returns the rotated node.
62
65
"""
63
66
function left_rotate (z:: AVLTreeNode )
64
67
y = z. rightChild
75
78
"""
76
79
right_rotate(node_x::AVLTreeNode)
77
80
78
- Performs a right-rotation on `node_x`, updates height of the nodes, and returns the rotated node.
81
+ Performs a right-rotation on `node_x`, updates height of the nodes, and returns the rotated node.
79
82
"""
80
83
function right_rotate (z:: AVLTreeNode )
81
84
y = z. leftChild
@@ -90,9 +93,9 @@ function right_rotate(z::AVLTreeNode)
90
93
end
91
94
92
95
"""
93
- minimum_node(tree::AVLTree, node::AVLTreeNode)
96
+ minimum_node(tree::AVLTree, node::AVLTreeNode)
94
97
95
- Returns the AVLTreeNode with minimum value in subtree of `node`.
98
+ Returns the AVLTreeNode with minimum value in subtree of `node`.
96
99
"""
97
100
function minimum_node (node:: Union{AVLTreeNode, Nothing} )
98
101
while node != nothing && node. leftChild != nothing
@@ -107,60 +110,60 @@ function search_node(tree::AVLTree{K}, d::K) where K
107
110
while node != nothing && node. data != nothing && node. data != d
108
111
109
112
prev = node
110
- if d < node. data
113
+ if d < node. data
111
114
node = node. leftChild
112
115
else
113
116
node = node. rightChild
114
117
end
115
118
end
116
-
119
+
117
120
return (node == nothing ) ? prev : node
118
121
end
119
122
120
- function Base. haskey (tree:: AVLTree{K} , d:: K ) where K
123
+ function Base. haskey (tree:: AVLTree{K} , d:: K ) where K
121
124
(tree. root == nothing ) && return false
122
125
node = search_node (tree, d)
123
126
return (node. data == d)
124
127
end
125
128
126
129
Base. in (key, tree:: AVLTree ) = haskey (tree, key)
127
130
128
- function Base. insert! (tree:: AVLTree{K} , d:: K ) where K
131
+ function insert_node (node:: Nothing , key:: K ) where K
132
+ return AVLTreeNode {K} (key)
133
+ end
134
+ function insert_node (node:: AVLTreeNode{K} , key:: K ) where K
135
+ if key < node. data
136
+ node. leftChild = insert_node (node. leftChild, key)
137
+ else
138
+ node. rightChild = insert_node (node. rightChild, key)
139
+ end
140
+
141
+ node. subsize = compute_subtree_size (node)
142
+ node. height = compute_height (node)
143
+ balance = get_balance (node)
129
144
130
- function insert_node (node:: Union{AVLTreeNode, Nothing} , key)
131
- if node == nothing
132
- return AVLTreeNode {K} (key)
133
- elseif key < node. data
134
- node. leftChild = insert_node (node. leftChild, key)
145
+ if balance > 1
146
+ if key < node. leftChild. data
147
+ return right_rotate (node)
135
148
else
136
- node. rightChild = insert_node (node. rightChild, key)
137
- end
138
-
139
- node. subsize = compute_subtree_size (node)
140
- node. height = compute_height (node)
141
- balance = get_balance (node)
142
-
143
- if balance > 1
144
- if key < node. leftChild. data
145
- return right_rotate (node)
146
- else
147
- node. leftChild = left_rotate (node. leftChild)
148
- return right_rotate (node)
149
- end
149
+ node. leftChild = left_rotate (node. leftChild)
150
+ return right_rotate (node)
150
151
end
152
+ end
151
153
152
- if balance < - 1
153
- if key > node. rightChild. data
154
- return left_rotate (node)
155
- else
156
- node. rightChild = right_rotate (node. rightChild)
157
- return left_rotate (node)
158
- end
154
+ if balance < - 1
155
+ if key > node. rightChild. data
156
+ return left_rotate (node)
157
+ else
158
+ node. rightChild = right_rotate (node. rightChild)
159
+ return left_rotate (node)
159
160
end
160
-
161
- return node
162
161
end
163
162
163
+ return node
164
+ end
165
+
166
+ function Base. insert! (tree:: AVLTree{K} , d:: K ) where K
164
167
haskey (tree, d) && return tree
165
168
166
169
tree. root = insert_node (tree. root, d)
@@ -173,55 +176,54 @@ function Base.push!(tree::AVLTree{K}, key0) where K
173
176
insert! (tree, key)
174
177
end
175
178
176
- function Base. delete! (tree:: AVLTree{K} , d:: K ) where K
177
-
178
- function delete_node! (node:: Union{AVLTreeNode, Nothing} , key)
179
- if key < node. data
180
- node. leftChild = delete_node! (node. leftChild, key)
181
- elseif key > node. data
182
- node. rightChild = delete_node! (node. rightChild, key)
179
+ function delete_node! (node:: AVLTreeNode{K} , key:: K ) where K
180
+ if key < node. data
181
+ node. leftChild = delete_node! (node. leftChild, key)
182
+ elseif key > node. data
183
+ node. rightChild = delete_node! (node. rightChild, key)
184
+ else
185
+ if node. leftChild == nothing
186
+ result = node. rightChild
187
+ return result
188
+ elseif node. rightChild == nothing
189
+ result = node. leftChild
190
+ return result
183
191
else
184
- if node. leftChild == nothing
185
- result = node. rightChild
186
- return result
187
- elseif node. rightChild == nothing
188
- result = node. leftChild
189
- return result
190
- else
191
- result = minimum_node (node. rightChild)
192
- node. data = result. data
193
- node. rightChild = delete_node! (node. rightChild, result. data)
194
- end
192
+ result = minimum_node (node. rightChild)
193
+ node. data = result. data
194
+ node. rightChild = delete_node! (node. rightChild, result. data)
195
195
end
196
-
197
- node . subsize = compute_subtree_size (node)
198
- node. height = compute_height (node)
199
- balance = get_balance (node)
200
-
201
- if balance > 1
202
- if get_balance (node . leftChild) >= 0
203
- return right_rotate (node)
204
- else
205
- node . leftChild = left_rotate (node . leftChild)
206
- return right_rotate (node)
207
- end
196
+ end
197
+
198
+ node. subsize = compute_subtree_size (node)
199
+ node . height = compute_height (node)
200
+ balance = get_balance (node)
201
+
202
+ if balance > 1
203
+ if get_balance (node. leftChild) >= 0
204
+ return right_rotate (node)
205
+ else
206
+ node . leftChild = left_rotate (node. leftChild )
207
+ return right_rotate (node)
208
208
end
209
+ end
209
210
210
- if balance < - 1
211
- if get_balance (node. rightChild) <= 0
212
- return left_rotate (node)
213
- else
214
- node. rightChild = right_rotate (node. rightChild)
215
- return left_rotate (node)
216
- end
217
- end
218
-
219
- return node
211
+ if balance < - 1
212
+ if get_balance (node. rightChild) <= 0
213
+ return left_rotate (node)
214
+ else
215
+ node. rightChild = right_rotate (node. rightChild)
216
+ return left_rotate (node)
217
+ end
220
218
end
221
219
220
+ return node
221
+ end
222
+
223
+ function Base. delete! (tree:: AVLTree{K} , d:: K ) where K
222
224
# if the key is not in the tree, do nothing and return the tree
223
225
! haskey (tree, d) && return tree
224
-
226
+
225
227
# if the key is present, delete it from the tree
226
228
tree. root = delete_node! (tree. root, d)
227
229
tree. count -= 1
@@ -244,12 +246,12 @@ function sorted_rank(tree::AVLTree{K}, key::K) where K
244
246
else
245
247
node = node. leftChild
246
248
end
247
- end
249
+ end
248
250
rank += (1 + get_subsize (node. leftChild))
249
251
return rank
250
252
end
251
253
252
- function Base. getindex (tree:: AVLTree{K} , ind:: Integer ) where K
254
+ function Base. getindex (tree:: AVLTree{K} , ind:: Integer ) where K
253
255
@boundscheck (1 <= ind <= tree. count) || throw (BoundsError (" $ind should be in between 1 and $(tree. count) " ))
254
256
function traverse_tree (node:: AVLTreeNode_or_null , idx)
255
257
if (node != nothing )
@@ -263,6 +265,6 @@ function Base.getindex(tree::AVLTree{K}, ind::Integer) where K
263
265
end
264
266
end
265
267
end
266
- value = traverse_tree (tree. root, ind)
268
+ value = traverse_tree (tree. root, ind)
267
269
return value
268
- end
270
+ end
0 commit comments