Skip to content

Commit 016ba5a

Browse files
committed
binary tree not complete, there is an error when convert
1 parent e60b9c4 commit 016ba5a

10 files changed

+392
-35
lines changed

Project.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name = "LinkedList"
1+
name = "DataStructure"
22
uuid = "3e022a7e-7250-4727-bf30-41362114d8c7"
33
authors = ["steiner <[email protected]>"]
44
version = "0.1.0"

src/DataStructure.jl

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module DataStructure
2+
3+
export LinkedList, BinaryTree, BadOperationException
4+
include("linkedlist/LinkedList.jl")
5+
include("binarytree/BinaryTree.jl")
6+
include("exceptions.jl")
7+
end

src/binarytree/BinaryTree.jl

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
module BinaryTree
2+
import Base:(==), iterate, eltype, show, insert!,
3+
keys, contains, length, popat!, replace!, filter, haskey,
4+
convert
5+
6+
export BinarySearchTree, search, AbstractBinaryTreeNode, AbstractBinaryTree
7+
using DataStructure.LinkedList
8+
9+
abstract type AbstractBinaryTree end
10+
11+
include("treenodes.jl")
12+
include("binarysearchtree.jl")
13+
14+
eltype(::BinarySearchTree{T}) where T = T
15+
eltype(::Type{Base.Iterators.Filter{F, V}}) where {F, V} = eltype(V)
16+
17+
length(tree::AbstractBinaryTree) = tree.length
18+
19+
function iterate(tree::AbstractBinaryTree)
20+
node = tree.root
21+
22+
if node === treenil
23+
return nothing
24+
end
25+
26+
queue = List(AbstractBinaryTreeNode)
27+
28+
if hasleft(node)
29+
push!(queue, left(node))
30+
end
31+
32+
if hasright(node)
33+
push!(queue, right(node))
34+
end
35+
36+
return dataof(node), queue
37+
end
38+
39+
function iterate(::AbstractBinaryTree, queue::List{<:AbstractBinaryTreeNode})
40+
isempty(queue) && return nothing
41+
42+
current = first(queue)
43+
if hasleft(current)
44+
push!(queue, left(current))
45+
end
46+
47+
if hasright(current)
48+
push!(queue, right(current))
49+
end
50+
51+
popfirst!(queue)
52+
return dataof(current), queue
53+
end
54+
55+
function show(io::IO, tree::AbstractBinaryTree)
56+
for value in tree
57+
print(io, value, " ")
58+
end
59+
end
60+
61+
function filter(pred::Function, tree::AbstractBinaryTree)
62+
Iterators.filter(pred, tree) |> collect
63+
end
64+
65+
function search(value::T, tree::AbstractBinaryTree)::AbstractBinaryTreeNode where T
66+
compare = tree.compare
67+
current = tree.root
68+
while current !== treenil
69+
result = compare(value, dataof(current))
70+
if result > 0
71+
current = right(current)
72+
elseif result < 0
73+
current = left(current)
74+
else
75+
break
76+
end
77+
end
78+
79+
return if current === treenil
80+
treenil
81+
else
82+
current
83+
end
84+
end
85+
86+
end

src/binarytree/binarysearchtree.jl

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
mutable struct BinarySearchTree{T} <: AbstractBinaryTree
2+
root::Union{BinaryTreeNil, BinaryTreeNode{T}}
3+
compare::Function
4+
length::Int
5+
end
6+
7+
BinarySearchTree(T::DataType, compare::Function) = BinarySearchTree{T}(treenil, compare, 0)
8+
9+
function insert!(tree::BinarySearchTree{T}, data::T) where T
10+
tree.root = insertNode!(tree.root, data, tree.compare)
11+
tree.length += 1
12+
end

src/binarytree/treenodes.jl

+225
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
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
File renamed without changes.

src/LinkedList.jl src/linkedlist/LinkedList.jl

+2-3
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@ module LinkedList
33
import Base: iterate, show, push!, pop!, popat!, pushfirst!, popfirst!,
44
isempty, length,
55
first, last,
6-
replace!, filter, keys, eltype
6+
replace!, filter, keys, eltype, convert
77

88
export ForwardList, List, ForwardNode, ListNode, AbstractLinkedList, AbstractListNode, AbstractConsNode,
99
iterate, show, push!, popat!, pushfirst!, popfirst!,
1010
isempty, length, first, last, replace!, filter, keys, eltype,
11-
insertNext!, removeNext!, dataof
11+
insertNext!, removeNext!, dataof, NilNode
1212

1313
include("nodes.jl")
14-
include("exceptioins.jl")
1514
include("lists.jl")
1615

1716
end # module LinkedList

0 commit comments

Comments
 (0)