ds 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +13 -0
- data/doc/Array.html +264 -0
- data/doc/DS.html +292 -0
- data/doc/DS/Array2D.html +345 -0
- data/doc/DS/BinaryHeap.html +493 -0
- data/doc/DS/BinarySearchTree.html +313 -0
- data/doc/DS/BinaryTree.html +433 -0
- data/doc/DS/CompleteBinaryTree.html +550 -0
- data/doc/DS/CyclicList.html +234 -0
- data/doc/DS/Digraph.html +299 -0
- data/doc/DS/Edge.html +283 -0
- data/doc/DS/ExpandableArray.html +316 -0
- data/doc/DS/Graph.html +739 -0
- data/doc/DS/GraphAsList.html +361 -0
- data/doc/DS/GraphAsMatrix.html +633 -0
- data/doc/DS/GraphAsTriMatrix.html +274 -0
- data/doc/DS/List.html +1263 -0
- data/doc/DS/ListElement.html +344 -0
- data/doc/DS/Queue.html +517 -0
- data/doc/DS/Ring.html +323 -0
- data/doc/DS/Stack.html +407 -0
- data/doc/DS/Tree.html +770 -0
- data/doc/DS/TreeWalker.html +561 -0
- data/doc/DS/TriMatrix.html +338 -0
- data/doc/created.rid +25 -0
- data/doc/ds/graphs/digraph_rb.html +52 -0
- data/doc/ds/graphs/edge_rb.html +52 -0
- data/doc/ds/graphs/graph_as_list_rb.html +52 -0
- data/doc/ds/graphs/graph_as_matrix_rb.html +52 -0
- data/doc/ds/graphs/graph_as_tri_matrix_rb.html +52 -0
- data/doc/ds/graphs/graph_rb.html +52 -0
- data/doc/ds/lists/cyclic_list_rb.html +52 -0
- data/doc/ds/lists/list_element_rb.html +52 -0
- data/doc/ds/lists/list_rb.html +52 -0
- data/doc/ds/lists/ring_rb.html +52 -0
- data/doc/ds/matrixes/array_2d_rb.html +52 -0
- data/doc/ds/matrixes/expandable_array_rb.html +52 -0
- data/doc/ds/matrixes/tri_matrix_rb.html +52 -0
- data/doc/ds/queues/queue_rb.html +52 -0
- data/doc/ds/stacks/stack_rb.html +52 -0
- data/doc/ds/trees/binary_heap_rb.html +52 -0
- data/doc/ds/trees/binary_search_tree_rb.html +52 -0
- data/doc/ds/trees/binary_tree_rb.html +52 -0
- data/doc/ds/trees/complete_binary_tree_rb.html +52 -0
- data/doc/ds/trees/tree_rb.html +52 -0
- data/doc/ds/trees/tree_walker_rb.html +52 -0
- data/doc/ds/version_rb.html +52 -0
- data/doc/ds_rb.html +98 -0
- data/doc/ext/ext_rb.html +52 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +375 -0
- data/doc/js/darkfish.js +116 -0
- data/doc/js/jquery.js +32 -0
- data/doc/js/quicksearch.js +114 -0
- data/doc/js/thickbox-compressed.js +10 -0
- data/doc/rdoc.css +763 -0
- data/ds.gemspec +20 -0
- data/lib/ds.rb +38 -0
- data/lib/ds/graphs/digraph.rb +20 -0
- data/lib/ds/graphs/edge.rb +15 -0
- data/lib/ds/graphs/graph.rb +107 -0
- data/lib/ds/graphs/graph_as_list.rb +48 -0
- data/lib/ds/graphs/graph_as_matrix.rb +114 -0
- data/lib/ds/graphs/graph_as_tri_matrix.rb +25 -0
- data/lib/ds/lists/cyclic_list.rb +21 -0
- data/lib/ds/lists/list.rb +303 -0
- data/lib/ds/lists/list_element.rb +26 -0
- data/lib/ds/lists/ring.rb +42 -0
- data/lib/ds/matrixes/array_2d.rb +35 -0
- data/lib/ds/matrixes/expandable_array.rb +37 -0
- data/lib/ds/matrixes/tri_matrix.rb +30 -0
- data/lib/ds/queues/queue.rb +53 -0
- data/lib/ds/stacks/stack.rb +39 -0
- data/lib/ds/trees/binary_heap.rb +71 -0
- data/lib/ds/trees/binary_search_tree.rb +32 -0
- data/lib/ds/trees/binary_tree.rb +65 -0
- data/lib/ds/trees/complete_binary_tree.rb +52 -0
- data/lib/ds/trees/tree.rb +117 -0
- data/lib/ds/trees/tree_walker.rb +179 -0
- data/lib/ds/version.rb +3 -0
- data/lib/ext/ext.rb +15 -0
- data/test/help.rb +8 -0
- data/test/test_array2d.rb +51 -0
- data/test/test_binary_heap.rb +35 -0
- data/test/test_binary_search_tree.rb +32 -0
- data/test/test_binary_tree.rb +51 -0
- data/test/test_complete_binary_tree.rb +30 -0
- data/test/test_digraph.rb +134 -0
- data/test/test_expandable_array.rb +26 -0
- data/test/test_graph.rb +71 -0
- data/test/test_list.rb +138 -0
- data/test/test_list_element.rb +56 -0
- data/test/test_queue.rb +110 -0
- data/test/test_ring.rb +28 -0
- data/test/test_stack.rb +87 -0
- data/test/test_tree.rb +48 -0
- data/test/test_tree_walker.rb +69 -0
- data/test/test_tri_matrix.rb +22 -0
- metadata +184 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module DS
|
|
2
|
+
|
|
3
|
+
#Container for linked lists elements.
|
|
4
|
+
class ListElement
|
|
5
|
+
|
|
6
|
+
attr_accessor :data, :next
|
|
7
|
+
|
|
8
|
+
def initialize(x=nil)
|
|
9
|
+
@data = x
|
|
10
|
+
@next= nil
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
#Adds new element to list.
|
|
14
|
+
def append(x)
|
|
15
|
+
elem = ListElement.new(x)
|
|
16
|
+
self.next = elem
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
#Checks if given element is last.
|
|
20
|
+
def tail?
|
|
21
|
+
@next.nil?
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module DS
|
|
2
|
+
|
|
3
|
+
#Ring - represent list which head is linked with tail.
|
|
4
|
+
class Ring < CyclicList
|
|
5
|
+
|
|
6
|
+
#Creates ring from array.
|
|
7
|
+
def self.from_array(arr)
|
|
8
|
+
list = Ring.new(arr.shift)
|
|
9
|
+
tail = list.head
|
|
10
|
+
arr.each { |e| tail = tail.append(e) }
|
|
11
|
+
tail.next = list.head
|
|
12
|
+
list
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def length
|
|
16
|
+
cycle_size
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
#Removes ring elements by k until there is only one element in list.
|
|
20
|
+
def eliminate_by(k)
|
|
21
|
+
elem = self.head
|
|
22
|
+
prev = elem
|
|
23
|
+
|
|
24
|
+
k = k-1
|
|
25
|
+
|
|
26
|
+
while prev != elem.next
|
|
27
|
+
|
|
28
|
+
k.times do
|
|
29
|
+
prev = elem
|
|
30
|
+
elem = elem.next
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
prev.next = elem.next
|
|
34
|
+
elem = prev.next
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
return prev.data
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module DS
|
|
2
|
+
|
|
3
|
+
#Implements two dimensional array.
|
|
4
|
+
class Array2D
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
#Creates new two dimensional array. Init is the default value of the array.
|
|
8
|
+
def initialize(size=1,init=0)
|
|
9
|
+
@init = init
|
|
10
|
+
@store = Array.new(size){Array.new(size){init}}
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def [](x,y)
|
|
15
|
+
if @store[x].nil?
|
|
16
|
+
@store[x] = []
|
|
17
|
+
@init
|
|
18
|
+
elsif @store[x][y].nil?
|
|
19
|
+
@init
|
|
20
|
+
else
|
|
21
|
+
@store[x][y]
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def []=(x,y,v)
|
|
26
|
+
@store[x] = [] if @store[x].nil?
|
|
27
|
+
@store[x][y] = v
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def to_a
|
|
31
|
+
@store.flatten
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module DS
|
|
2
|
+
|
|
3
|
+
#Class provides access to any element in array. If index i
|
|
4
|
+
#is greter than array size then elements from size to i are
|
|
5
|
+
#filled with extender.
|
|
6
|
+
class ExpandableArray < Array
|
|
7
|
+
def initialize(size=0,extender=0)
|
|
8
|
+
@extender = extender
|
|
9
|
+
super(size,extender)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
#Returns element at index. If index is greater than size of array then
|
|
13
|
+
#elements from size to index are filled with extender.
|
|
14
|
+
def [](x)
|
|
15
|
+
if x >=size
|
|
16
|
+
for i in size..x
|
|
17
|
+
self[i]=@extender
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
super(x)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
#Sets the element at index. If index is greater than size of array then
|
|
24
|
+
#elements from size to index are filled with extender.
|
|
25
|
+
def []=(x,v)
|
|
26
|
+
max = size
|
|
27
|
+
super(x,v)
|
|
28
|
+
if size - max >1
|
|
29
|
+
(max..size-2).each do |i|
|
|
30
|
+
self[i] = @extender
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module DS
|
|
2
|
+
class TriMatrix
|
|
3
|
+
|
|
4
|
+
#Class implements Triangular Matrix (lower).
|
|
5
|
+
|
|
6
|
+
#Creates new triangular matrix.
|
|
7
|
+
def initialize(init=0)
|
|
8
|
+
@store =ExpandableArray.new(0,init)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
#Returns element at index x,y (or y,x).
|
|
12
|
+
def [](x,y)
|
|
13
|
+
x,y = y,x if y > x
|
|
14
|
+
index = (x*x+x)/2 +y
|
|
15
|
+
@store[index]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
#Sets the element at index x,y (or y,x).
|
|
19
|
+
def []=(x,y,v)
|
|
20
|
+
x,y = y,x if y>x
|
|
21
|
+
index = (x*x+x)/2 +y
|
|
22
|
+
@store[index] = v
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def to_a
|
|
26
|
+
@store
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
module DS
|
|
2
|
+
|
|
3
|
+
#Class implements queue data structure.
|
|
4
|
+
|
|
5
|
+
class Queue
|
|
6
|
+
|
|
7
|
+
#Create new queue. First parameter determines how the queue will be represented internally.
|
|
8
|
+
def initialize(store = :array)
|
|
9
|
+
if store == :array
|
|
10
|
+
@store = []
|
|
11
|
+
else
|
|
12
|
+
@store = List.new
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
#Create new queue.Internaly uses list to store elements.
|
|
17
|
+
def Queue.create
|
|
18
|
+
new(:list)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
#Adds element to queue and returns queue itself.
|
|
22
|
+
def enqueue(x)
|
|
23
|
+
@store << x
|
|
24
|
+
self
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
alias :push :enqueue
|
|
28
|
+
|
|
29
|
+
#Removes element from queue and returns it.
|
|
30
|
+
def dequeue
|
|
31
|
+
@store.shift
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
alias :shift :dequeue
|
|
35
|
+
|
|
36
|
+
#Returns element from forehead of queue.
|
|
37
|
+
def peek
|
|
38
|
+
@store.first
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
#Returns length of queue. If queue is empty returns 0.
|
|
42
|
+
def length
|
|
43
|
+
@store.length
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
#Checks if queue is empty.
|
|
47
|
+
def empty?
|
|
48
|
+
@store.empty?
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
module DS
|
|
2
|
+
|
|
3
|
+
#Class implements Stack data structure.
|
|
4
|
+
#Internaly uses array to store elements.
|
|
5
|
+
|
|
6
|
+
class Stack
|
|
7
|
+
|
|
8
|
+
def initialize
|
|
9
|
+
@store = []
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
#Returns the stack size.
|
|
13
|
+
def size
|
|
14
|
+
@store.size
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Removes element from stack and returns it.
|
|
18
|
+
def pop
|
|
19
|
+
@store.pop
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Adds element to the top of the stack.
|
|
23
|
+
def push(x)
|
|
24
|
+
@store.push x
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Returns element from the top of the stack.
|
|
28
|
+
def peek
|
|
29
|
+
@store.last
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# If stack is empty returns true otherwise returns false.
|
|
33
|
+
def empty?
|
|
34
|
+
@store.empty?
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
module DS
|
|
2
|
+
class BinaryHeap < CompleteBinaryTree
|
|
3
|
+
attr_accessor :data
|
|
4
|
+
|
|
5
|
+
#Create new Heap from args.
|
|
6
|
+
#Given block sets the heap relation. Default heap relation is Max Heap.
|
|
7
|
+
def initialize(*args, &block)
|
|
8
|
+
if block_given?
|
|
9
|
+
@relation = block
|
|
10
|
+
else
|
|
11
|
+
@relation = Proc.new{|parent,child| parent >= child}
|
|
12
|
+
end
|
|
13
|
+
@data = args.to_a
|
|
14
|
+
heapify!
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def set_relation(&relation)
|
|
18
|
+
@relation = relation
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def relation(parent,child)
|
|
22
|
+
@relation.call(@data[parent],@data[child])
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
#Arranges data in heap.
|
|
26
|
+
#O(n)
|
|
27
|
+
def heapify!
|
|
28
|
+
(@data.size/2).downto(0) do |i|
|
|
29
|
+
heapify(i)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
#Inserts new value to heap maintaining the heap relation.
|
|
34
|
+
#Returns heap itself.
|
|
35
|
+
#O(log)
|
|
36
|
+
def insert(value)
|
|
37
|
+
@data.push value
|
|
38
|
+
child = @data.size-1
|
|
39
|
+
parent = parent_index(child)
|
|
40
|
+
|
|
41
|
+
while parent >= 0 and !relation(parent,child)
|
|
42
|
+
@data[child], @data[parent] = @data[parent], @data[child]
|
|
43
|
+
child = parent
|
|
44
|
+
parent = parent_index(child)
|
|
45
|
+
end
|
|
46
|
+
self
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
#Maintain heap condition for i node.
|
|
50
|
+
#O(log)
|
|
51
|
+
def heapify(i)
|
|
52
|
+
left = left_index(i)
|
|
53
|
+
left = nil if left >= @data.size
|
|
54
|
+
|
|
55
|
+
right = right_index(i)
|
|
56
|
+
right = nil if right >= @data.size
|
|
57
|
+
|
|
58
|
+
largest = [i,left,right].compact.sort{|x,y| relation(x,y)?-1:1}.first
|
|
59
|
+
|
|
60
|
+
if largest != i
|
|
61
|
+
@data[i], @data[largest] = @data[largest], @data[i]
|
|
62
|
+
heapify(largest)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def to_a
|
|
67
|
+
@data
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module DS
|
|
2
|
+
class BinarySearchTree < BinaryTree
|
|
3
|
+
|
|
4
|
+
def self.from_array(arr)
|
|
5
|
+
tree = BinarySearchTree.new(arr.shift)
|
|
6
|
+
arr.each do |e|
|
|
7
|
+
tree.insert e
|
|
8
|
+
end
|
|
9
|
+
tree
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def insert x
|
|
13
|
+
if x > @data and right.nil?
|
|
14
|
+
self.right = BinarySearchTree.new(x)
|
|
15
|
+
elsif x <= @data and left.nil?
|
|
16
|
+
self.left = BinarySearchTree.new(x)
|
|
17
|
+
elsif x > @data
|
|
18
|
+
right.insert x
|
|
19
|
+
else
|
|
20
|
+
left.insert x
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def BinarySearchTree.valid?(other)
|
|
26
|
+
walker = TreeWalker.new(other)
|
|
27
|
+
walker.traverse(:inorder)
|
|
28
|
+
walker.visited.sorted?
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
module DS
|
|
2
|
+
class BinaryTree < Tree
|
|
3
|
+
|
|
4
|
+
def left
|
|
5
|
+
if @children.empty?
|
|
6
|
+
nil
|
|
7
|
+
else
|
|
8
|
+
@children[0]
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def left=(value)
|
|
13
|
+
@children[0] = value
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def right
|
|
17
|
+
if @children.empty?
|
|
18
|
+
nil
|
|
19
|
+
else
|
|
20
|
+
@children[1]
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def right=(value)
|
|
25
|
+
@children[1] = value
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def << (value)
|
|
29
|
+
subtree = BinaryTree.new(value)
|
|
30
|
+
@children << subtree
|
|
31
|
+
return subtree
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
#Inserts new element in BSF order
|
|
35
|
+
def insert(x)
|
|
36
|
+
q = Queue.new
|
|
37
|
+
if @data == nil
|
|
38
|
+
@data = x
|
|
39
|
+
elsif self.left == nil
|
|
40
|
+
self.left = BinaryTree.new(x)
|
|
41
|
+
elsif self.right == nil
|
|
42
|
+
self.right = BinaryTree.new(x)
|
|
43
|
+
else
|
|
44
|
+
q.push self.left
|
|
45
|
+
q.push self.right
|
|
46
|
+
loop do
|
|
47
|
+
node = q.shift
|
|
48
|
+
if node.left == nil
|
|
49
|
+
node.insert(x)
|
|
50
|
+
break
|
|
51
|
+
else
|
|
52
|
+
q.push node.left
|
|
53
|
+
end
|
|
54
|
+
if node.right == nil
|
|
55
|
+
node.insert(x)
|
|
56
|
+
break
|
|
57
|
+
else
|
|
58
|
+
q.push node.right
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module DS
|
|
2
|
+
class CompleteBinaryTree
|
|
3
|
+
|
|
4
|
+
def initialize(*args)
|
|
5
|
+
if args.empty?
|
|
6
|
+
@data = []
|
|
7
|
+
else
|
|
8
|
+
@data = args.to_a
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def << (value)
|
|
13
|
+
@data.push value
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def root
|
|
17
|
+
@data.first
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def children(value)
|
|
21
|
+
i = @data.index(value)
|
|
22
|
+
return [@data[2*i+1], @data[2*i+2]]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def right value
|
|
26
|
+
children(value)[1]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def left value
|
|
30
|
+
children(value).first
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def left_index(i)
|
|
34
|
+
2*i+1
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def right_index(i)
|
|
38
|
+
2*i+2
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def parent_index(i)
|
|
42
|
+
(i+1)/2 - 1
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def parent value
|
|
46
|
+
i = @data.index(value)
|
|
47
|
+
@data[parent_index(i)]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|