1
+ abstract type AbstractBinaryTreeNode end
2
+ abstract type AbstractBinaryTreeConsNode{T} <: AbstractBinaryTreeNode end
3
+
4
+ struct BinaryTreeNil <: AbstractBinaryTreeNode end
5
+
6
+ treenil = BinaryTreeNil ()
7
+
8
+ mutable struct BinaryTreeNode{T} <: AbstractBinaryTreeConsNode{T}
9
+ data:: T
10
+ left:: Union{BinaryTreeNode{T}, BinaryTreeNil}
11
+ right:: Union{BinaryTreeNode{T}, BinaryTreeNil}
12
+ end
13
+
14
+ mutable struct AVLTreeNode{T} <: AbstractBinaryTreeConsNode{T}
15
+ data:: T
16
+ left:: Union{AVLTreeNode{T}, BinaryTreeNil}
17
+ right:: Union{AVLTreeNode{T}, BinaryTreeNil}
18
+ height:: Int
19
+ end
20
+
21
+ BinaryTreeNode (data:: T ) where T = BinaryTreeNode {T} (data, treenil, treenil)
22
+ AVLTreeNode (data:: T ) where T = AVLTreeNode {T} (data, treenil, treenil)
23
+
24
+ dataof (node:: AbstractBinaryTreeConsNode ) = node. data
25
+ left (node:: AbstractBinaryTreeConsNode ) = node. left
26
+ right (node:: AbstractBinaryTreeConsNode ) = node. right
27
+
28
+ == (leftnode:: AbstractBinaryTreeConsNode , rightnode:: AbstractBinaryTreeConsNode ) = dataof (leftnode) == dataof (rightnode) &&
29
+ left (leftnode) == left (rightnode) &&
30
+ right (leftnode) == right (rightnode)
31
+
32
+ show (io:: IO , :: BinaryTreeNil ) = print (io, " treenil" )
33
+ show (io:: IO , node:: AbstractBinaryTreeConsNode ) = print (io, " treenode: " , dataof (node))
34
+
35
+ isleaf (node:: AbstractBinaryTreeConsNode ) = left (node) === treenil && right (node) === treenil
36
+ hasleft (node:: AbstractBinaryTreeConsNode ) = left (node) != = treenil
37
+ hasright (node:: AbstractBinaryTreeConsNode ) = right (node) != = treenil
38
+
39
+ insertNode! (:: BinaryTreeNil , data:: T , compare:: Function ) where T = BinaryTreeNode (data)
40
+ function insertNode! (node:: AbstractBinaryTreeConsNode{T} , data:: T , compare:: Function ) where T
41
+ if compare (data, dataof (node)) < 0
42
+ node. left = insertNode! (left (node), data, compare)
43
+ else
44
+ node. right = insertNode! (right (node), data, compare)
45
+ end
46
+
47
+ return node
48
+ end
49
+
50
+ iterate (:: BinaryTreeNil ) = nothing
51
+ function iterate (node:: AbstractBinaryTreeConsNode{T} ) where T
52
+ queue = List (AbstractBinaryTreeNode{T})
53
+
54
+ if hasleft (node)
55
+ push! (queue, left (node))
56
+ end
57
+
58
+ if hasright (node)
59
+ push! (queue, right (node))
60
+ end
61
+
62
+ return node, queue
63
+ end
64
+
65
+ function itearte (:: AbstractBinaryTreeConsNode{T} , queue:: List{<:AbstractBinaryTreeNode} ) where T
66
+ if isempty (queue)
67
+ return nothing
68
+ end
69
+
70
+ current = popfirst! (queue)
71
+ if hasleft (current)
72
+ push! (queue, left (current))
73
+ end
74
+
75
+ if hasright (current)
76
+ push! (queue, right (current))
77
+ end
78
+
79
+ return current, queue
80
+ end
81
+
82
+ function findNode (node:: AbstractBinaryTreeConsNode , data:: T , compare:: Function ):: AbstractBinaryTreeNode where T
83
+ backfather = node
84
+ status = 0
85
+ result = compare (dataof (node), data)
86
+
87
+ while node != = treenil
88
+ if result== 0
89
+ return backfather
90
+ end
91
+
92
+ backfather = node
93
+ if result > 0
94
+ node = left (node)
95
+ status = - 1
96
+ else
97
+ node = right (node)
98
+ status = 1
99
+ end
100
+ end
101
+
102
+ return treenil
103
+ end
104
+
105
+ height (:: BinaryTreeNil ) = 0
106
+ height (node:: AVLTreeNode ) = node. height
107
+ balanceFactor (:: BinaryTreeNil ) = 0
108
+ balanceFactor (node:: AVLTreeNode ) = height (left (node)) - height (right (node))
109
+
110
+ function rotateLeftLeft! (node:: AVLTreeNode ):: AVLTreeNode
111
+ rightnode = right (node)
112
+ leftnode = left (rightnode)
113
+
114
+ rightnode. left = node
115
+ node. right = leftnode
116
+
117
+ node. height = max (height (left (node)), height (right (node))) + 1
118
+ rightnode. height = max (height (left (rightnode)), height (right (rightnode))) + 1
119
+
120
+ return rightnode
121
+ end
122
+
123
+ function rotateRightRight! (node:: AVLTreeNode ):: AVLTreeNode
124
+ leftnode = left (node)
125
+ rightnode = right (leftnode)
126
+
127
+ leftnode. right = node
128
+ node. left = rightnode
129
+
130
+ node. height = max (height (left (node)), height (right (node))) + 1
131
+ leftnode. height = max (height (left (leftnode)), height (right (leftnode))) + 1
132
+
133
+ return leftnode
134
+ end
135
+
136
+ function rotateLeftRight! (node:: AVLTreeNode ):: AVLTreeNode
137
+ node. left = rotateRightRight! (left (node))
138
+ return rotateLeftLeft! (node)
139
+ end
140
+
141
+ function rotateRightLeft! (node:: AVLTreeNode ):: AVLTreeNode
142
+ node. right = rotateLeftLeft! (right (node))
143
+ return rotateRightRight! (node)
144
+ end
145
+
146
+ function rebalance! (node:: AVLTreeNode ):: AVLTreeNode
147
+ factor = balanceFactor (node)
148
+ if factor > 1 && balanceFactor (left (node)) > 0
149
+ return rotateRightRight! (node)
150
+ elseif factor > 1 && balanceFactor (left (node)) <= 0
151
+ return rotateLeftRight! (node)
152
+ elseif factor < - 1 && balanceFactor (right (node)) <= 0
153
+ return rotateLeftLeft! (node)
154
+ elseif factor < - 1 && balanceFactor (right (node)) > 0
155
+ return rotateRightLeft! (node)
156
+ else
157
+ return node
158
+ end
159
+ end
160
+
161
+ insertAVLNode! (:: BinaryTreeNil , data:: T , compare:: Function ) where T = AVLTreeNode (data)
162
+
163
+ function insertAVLNode! (node:: AVLTreeNode{T} , data:: T , compare:: Function ):: AVLTreeNode{T} where T
164
+ result = compare (data, dataof (node))
165
+ if result > 0
166
+ node. right = insertAVLNode! (right (node), data, compare)
167
+ elseif result < 0
168
+ node. left = insertAVLNode! (left (node), data, compare)
169
+ else
170
+ return node
171
+ end
172
+
173
+ node. height = max (height (left (node)), height (right (node))) + 1
174
+ node = rebalance! (node)
175
+ return node
176
+ end
177
+
178
+ function deleteAVLNode! (node:: AVLTreeNode{T} , data:: T , compare:: Function ):: AVLTreeNode{T} where T
179
+ result = compare (data, dataof (node))
180
+
181
+ if result < 0
182
+ node. left = deleteAVLNode! (left (node), data, compare)
183
+ elseif result > 0
184
+ node. right = deleteAVLNode! (right (node), data, compare)
185
+ else
186
+ if ! hasleft (node) || ! hasright (node)
187
+ temp = treenil
188
+ if temp == left (node)
189
+ temp = right (node)
190
+ else
191
+ temp = left (node)
192
+ end
193
+
194
+ if temp === treenil
195
+ temp = node
196
+ node = treenil
197
+ else
198
+ node = temp
199
+ end
200
+ else
201
+ temp = minValueNode (right (node))
202
+ node. data = dataof (temp)
203
+ node. right = deleteAVLNode! (right (node), dataof (temp), compare)
204
+ end
205
+ end
206
+
207
+ if node === treenil
208
+ return node
209
+ end
210
+
211
+ node. height = max (height (left (node)), height (right (node))) + 1
212
+ return rebalance! (node)
213
+ end
214
+
215
+ function minValueNode (node:: Union{AVLTreeNode, BinaryTreeNil} )
216
+ current = node
217
+ while current != = treenil && left (current) != = treenil
218
+ current = left (current)
219
+ end
220
+
221
+ return current
222
+ end
223
+
224
+ eltype (:: BinaryTreeNode{T} ) where T = T
225
+ eltype (:: AVLTreeNode{T} ) where T = T
0 commit comments