Skip to content

Commit b14134f

Browse files
committed
export RBTree and deploy docs
1 parent aedbb0b commit b14134f

File tree

6 files changed

+52
-15
lines changed

6 files changed

+52
-15
lines changed

docs/make.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ makedocs(
2525
"intset.md",
2626
"sorted_containers.md",
2727
"dibit_vector.md",
28+
"red_black_tree.md",
2829
],
2930
modules = [DataStructures],
3031
format = Documenter.HTML()

docs/src/index.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ This package implements a variety of data structures, including
2222
- DataStructures.IntSet
2323
- SparseIntSet
2424
- DiBitVector
25+
- Red Black Tree
2526

2627
## Contents
2728

@@ -46,6 +47,7 @@ Pages = [
4647
"intset.md",
4748
"sorted_containers.md",
4849
"sparse_int_set.md",
49-
"dibit_vector.md"
50+
"dibit_vector.md",
51+
"red_black_tree.md"
5052
]
5153
```

docs/src/red_black_tree.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
```@meta
2+
DocTestSetup = :(using DataStructures)
3+
```
4+
5+
# Red Black Tree
6+
7+
The `RBTree` type is an implementation of Red Black Tree in Julia. It is a self-balancing binary search tree with an extra bit of information, the color, in each of its node. Operations such as search, insert and delete can be done in `O(log n)` complexity, where `n` is the number of nodes in the `RBTree`.
8+
9+
Examples:
10+
11+
```jldoctest
12+
julia> tree = RBTree{Int}();
13+
14+
julia> for k in 1:2:20
15+
push!(tree, k)
16+
end
17+
18+
julia> haskey(tree, 3)
19+
true
20+
21+
julia> getindex(tree, 4)
22+
7
23+
24+
julia> for k in 1:2:10
25+
delete!(tree, k)
26+
end
27+
28+
julia> haskey(tree, 5)
29+
false
30+
```
31+
32+
```@meta
33+
DocTestSetup = nothing
34+
```

src/DataStructures.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ module DataStructures
6161

6262
export DiBitVector
6363

64+
export RBTree, search_node, minimum_node
65+
6466
export findkey
6567

6668
include("delegate.jl")

src/red_black_tree.jl

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ mutable struct RBTree{K}
3131
function RBTree{K}() where K
3232
rb = new()
3333
rb.nil = create_null_node(K)
34-
rb.root = Ref(rb.nil)[]
34+
rb.root = rb.nil
3535
rb.count = 0
3636
return rb
3737
end
@@ -50,7 +50,7 @@ search_node(tree, key)
5050

5151
function search_node(tree::RBTree{K}, d::K) where K
5252
node = tree.root
53-
while node != tree.nil && d != node.data
53+
while node !== tree.nil && d != node.data
5454
if d < node.data
5555
node = node.leftChild
5656
else
@@ -81,7 +81,7 @@ function insert_node!(tree::RBTree, node::RBTreeNode)
8181
node_y = nothing
8282
node_x = tree.root
8383

84-
while node_x != tree.nil
84+
while node_x !== tree.nil
8585
node_y = node_x
8686
if node.data < node_x.data
8787
node_x = node_x.leftChild
@@ -108,7 +108,7 @@ Performs a left-rotation on `node_x` and updates `tree.root`, if required.
108108
function left_rotate!(tree::RBTree, node_x::RBTreeNode)
109109
node_y = node_x.rightChild
110110
node_x.rightChild = node_y.leftChild
111-
if node_y.leftChild != tree.nil
111+
if node_y.leftChild !== tree.nil
112112
node_y.leftChild.parent = node_x
113113
end
114114
node_y.parent = node_x.parent
@@ -131,7 +131,7 @@ Performs a right-rotation on `node_x` and updates `tree.root`, if required.
131131
function right_rotate!(tree::RBTree, node_x::RBTreeNode)
132132
node_y = node_x.leftChild
133133
node_x.leftChild = node_y.rightChild
134-
if node_y.rightChild != tree.nil
134+
if node_y.rightChild !== tree.nil
135135
node_y.rightChild.parent = node_x
136136
end
137137
node_y.parent = node_x.parent
@@ -327,8 +327,8 @@ end
327327
Returns the RBTreeNode with minimum value in subtree of `node`.
328328
"""
329329
function minimum_node(tree::RBTree, node::RBTreeNode)
330-
(node == tree.nil) && return node
331-
while node.leftChild != tree.nil
330+
(node === tree.nil) && return node
331+
while node.leftChild !== tree.nil
332332
node = node.leftChild
333333
end
334334
return node
@@ -345,7 +345,7 @@ function Base.delete!(tree::RBTree{K}, d::K) where K
345345
z = tree.nil
346346
node = tree.root
347347

348-
while node != tree.nil
348+
while node !== tree.nil
349349
if node.data == d
350350
z = node
351351
end
@@ -357,15 +357,15 @@ function Base.delete!(tree::RBTree{K}, d::K) where K
357357
end
358358
end
359359

360-
(z == tree.nil) && return tree
360+
(z === tree.nil) && return tree
361361

362362
y = z
363363
y_original_color = y.color
364364
x = RBTreeNode{K}()
365-
if z.leftChild == tree.nil
365+
if z.leftChild === tree.nil
366366
x = z.rightChild
367367
rb_transplant(tree, z, z.rightChild)
368-
elseif z.rightChild == tree.nil
368+
elseif z.rightChild === tree.nil
369369
x = z.leftChild
370370
rb_transplant(tree, z, z.leftChild)
371371
else
@@ -404,7 +404,7 @@ getindex(tree, ind)
404404
function Base.getindex(tree::RBTree{K}, ind) where K
405405
@boundscheck (1 <= ind <= tree.count) || throw(ArgumentError("$ind should be in between 1 and $(tree.count)"))
406406
function traverse_tree_inorder(node::RBTreeNode{K}) where K
407-
if (node != tree.nil)
407+
if (node !== tree.nil)
408408
left = traverse_tree_inorder(node.leftChild)
409409
right = traverse_tree_inorder(node.rightChild)
410410
append!(push!(left, node.data), right)

test/test_red_black_tree.jl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
include("../src/red_black_tree.jl")
21
@testset "RBTree" begin
32
@testset "inserting values" begin
43
t = RBTree{Int}()
@@ -41,7 +40,6 @@ include("../src/red_black_tree.jl")
4140
end
4241

4342
@test length(t) == 100
44-
4543
end
4644

4745
@testset "handling different cases of delete!" begin

0 commit comments

Comments
 (0)