ruby-avl 0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7a02458c007e726e16b423af5bec30aabd799260
4
+ data.tar.gz: e0e82835afd930aff2858a6083b2357c084d300e
5
+ SHA512:
6
+ metadata.gz: 3fd204050d57a8f9918d2487bec619d82043352f0052f71bc75932db3e869ef2e959b02ec094b8252c14986a69c321b23403f5c99634f0f0ac0f012fb3388f4c
7
+ data.tar.gz: d45ac33cc6aa5850cfe309873000c36b81b66f0f6ef94860988e9e8e4b6e650bd5331c8f6593b10fbabbf9ab107b3eddb6fd788c7866873a49b112c338a2ac5e
@@ -0,0 +1 @@
1
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
File without changes
@@ -0,0 +1,7 @@
1
+ begin
2
+ require 'rspec/core/rake_task'
3
+ RSpec::Core::RakeTask.new(:spec)
4
+ rescue LoadError
5
+ end
6
+
7
+ task default: :spec
@@ -0,0 +1,6 @@
1
+ require 'ruby-avl/bs_tree'
2
+ require 'ruby-avl/node'
3
+ require 'ruby-avl/avl_tree'
4
+ require 'ruby-avl/bs_tree_traversal'
5
+
6
+ module AVLTree; end
@@ -0,0 +1,91 @@
1
+ require_relative 'bs_tree'
2
+ module AVLTree
3
+ class AVLTree < BSTree::BSTree
4
+
5
+ # Public interfaces implemented in superclass
6
+
7
+ private
8
+
9
+ # Calls superclass (BSTree) method passing in parameters
10
+ # recieved from caller. Passes in the returned value of
11
+ # BSTree#add_to_tree to :rebalance and returns final result.
12
+ def add_to_tree(item, node)
13
+ return rebalance(super(item, node))
14
+ end
15
+
16
+ # Calls superclass (BSTree) method passing in parameters
17
+ # recieved from caller. Passes in the returned value of
18
+ # BSTree#remove_from_tree to :rebalance and returns final
19
+ # result.
20
+ def remove_from_tree(item, node)
21
+ return rebalance(super(item, node))
22
+ end
23
+
24
+ # Checks the balance factor of the node and rotates the tree
25
+ # if inbalanced in any way. Balance algorithm:
26
+ # IF tree is right heavy
27
+ # IF tree's right subtree is left heavy (Right Left Case)
28
+ # Perform Double Left rotation
29
+ # ELSE (Right Right Case)
30
+ # Perform Single Left rotation
31
+ # ELSE IF tree is left heavy
32
+ # IF tree's left subtree is right heavy (Left Right Case)
33
+ # Perform Double Right rotation
34
+ # ELSE (Left Left Case)
35
+ # Perform Single Right rotation
36
+ # END IF
37
+ def rebalance(node)
38
+ if balance_factor(node) >= 2
39
+ if (balance_factor(node.left) < 0)
40
+ return double_rotate_right(node)
41
+ else
42
+ return rotate_right(node)
43
+ end
44
+ elsif balance_factor(node) <= -2
45
+ if (balance_factor(node.right) > 0)
46
+ return double_rotate_left(node)
47
+ else
48
+ return rotate_left(node)
49
+ end
50
+ else
51
+ return node
52
+ end
53
+ end
54
+
55
+ # Node becomes the left subtree of it's right subtree.
56
+ def rotate_left(node)
57
+ new_node = node.right
58
+ node.right = new_node.left
59
+ new_node.left = node
60
+ return new_node
61
+ end
62
+
63
+ # Right rotation performed on node's right subtree before
64
+ # node is rotated left.
65
+ def double_rotate_left(node)
66
+ node.right = rotate_right(node.right)
67
+ return rotate_left(node)
68
+ end
69
+
70
+ # Node becomes the right subtree of it's left subtree.
71
+ def rotate_right(node)
72
+ new_node = node.left
73
+ node.left = new_node.right
74
+ new_node.right = node
75
+ return new_node
76
+ end
77
+
78
+ # Left rotation performed on node's left subtree before
79
+ # node is rotated right.
80
+ def double_rotate_right(node)
81
+ node.left = rotate_left(node.left)
82
+ return rotate_right(node)
83
+ end
84
+
85
+ # Calculates the height of the left subtree, then subtracts the height of the
86
+ # right subtree to produce the balance factor for the node.
87
+ def balance_factor(node)
88
+ node.nil? ? 0 : (height(node.left) - height(node.right))
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,117 @@
1
+ module BSTree
2
+ class BSTree
3
+
4
+ attr_reader :root
5
+
6
+ def initialize(root = nil)
7
+ @root = root
8
+ end
9
+
10
+ # Starts the search for the insertion at the root of
11
+ # the tree. Set the new root at the end if it has changed.
12
+ def insert_item(item)
13
+ @root = add_to_tree(item, @root)
14
+ end
15
+
16
+ # Starts the search for the deletion at the root of
17
+ # the tree. Set the new root at the end if it has changed.
18
+ def remove_item(item)
19
+ @root = remove_from_tree(item, @root)
20
+ end
21
+
22
+ # Starts the count at the root node.
23
+ def number_of_nodes
24
+ node_count(@root)
25
+ end
26
+
27
+ # Starts the count of the depth at the root node.
28
+ def depth_of_tree
29
+ tree_depth(@root, 0)
30
+ end
31
+
32
+ private
33
+
34
+ # If the current node is null then a new Node object is created and item
35
+ # is passed in as a constructor. If item is smaller than the data stored
36
+ # in the current node then :add_to_tree is called recursively to traverse
37
+ # the left-sub tree until the node is null. The same thing happens if the
38
+ # item is larger, but the right sub-tree is traversed. If item is neither
39
+ # larger nor smaller then it must be equal, in which case an error will be
40
+ # raised to inform the user of duplication.
41
+ def add_to_tree(item, node)
42
+ if node.nil?
43
+ return Node::Node.new(item)
44
+ elsif compare(item, node.data) < 0
45
+ node.left = add_to_tree(item, node.left)
46
+ elsif compare(item, node.data) > 0
47
+ node.right = add_to_tree(item, node.right)
48
+ else
49
+ puts 'Duplicate entry. Skipping: %s' % item
50
+ end
51
+ return node
52
+ end
53
+
54
+ # If the current node is null then the tree is empty or the item isn't in it.
55
+ # If item is smaller or larger than current node like above, if it's neither then
56
+ # it must be equal so checks are made to see how many children that node has. If
57
+ # it has two then a the value of the node is swapped with the value of the
58
+ # smallest item in it's right-sub tree, then removeItem is called again but this time
59
+ # on the value in the right sub-tree. If the node has less than two children
60
+ # another check is made: if the left child is not null, the value of the node is
61
+ # equal to that value, otherwise it's equal to the value of the right child.
62
+ def remove_from_tree(item, node)
63
+ return if node.nil?
64
+ if compare(item, node.data) < 0
65
+ node.left = remove_from_tree(item, node.left)
66
+ elsif compare(item, node.data) > 0
67
+ node.right = remove_from_tree(item, node.right)
68
+ elsif node.left && node.right
69
+ node.data = least_item(node.right).data
70
+ node.right = remove_from_tree(node.data, node.right)
71
+ else
72
+ node = node.left ? node.left : node.right
73
+ end
74
+ return node
75
+ end
76
+
77
+ # Comparison of two objects. Will return -1 if item_one is less than item_two, 0 if
78
+ # they are equal, and 1 if item_one is greater than item_two. First checks if object
79
+ # has it's own comparison logic, if not, uses core Ruby comparision.
80
+ def compare(item_one, item_two)
81
+ begin
82
+ item_one.compare_to(item_two)
83
+ rescue NoMethodError
84
+ item_one <=> item_two
85
+ end
86
+ end
87
+
88
+ # Recursively finds the lowest item in a nodes left subtree.
89
+ def least_item(node)
90
+ return unless node
91
+ return node unless node.left
92
+ least_item(node.left)
93
+ end
94
+
95
+ # Traverses the tree and returns the sum of the nodes.
96
+ def node_count(node)
97
+ node.nil? ? 0 : 1 + node_count(node.left) + node_count(node.right)
98
+ end
99
+
100
+ # Traverses the tree and calculates the depth of the longest sub-tree
101
+ def tree_depth(node, depth)
102
+ node.nil? ? 0 : depth + max(height(node.left), height(node.right))
103
+ end
104
+
105
+ # Calculates the height of the node using it's leaves. Initial check to see if
106
+ # node is nil which means it has a height of 0.
107
+ def height(node)
108
+ node.nil? ? 0 : 1 + max(height(node.left), height(node.right))
109
+ end
110
+
111
+ # Converts parameters to an Array then calls Enumerable#max on them to return
112
+ # the largest element.
113
+ def max(*values)
114
+ values.max
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,72 @@
1
+ module BSTreeTraversal
2
+ class BSTreeTraversal
3
+
4
+ def pre_order_array(root_node, attribute = nil)
5
+ pre_order(root_node, attribute, [])
6
+ end
7
+
8
+ def pre_order_string(root_node, attribute = nil)
9
+ pre_order(root_node, attribute, []).join(', ')
10
+ end
11
+
12
+ def in_order_array(root_node, attribute = nil)
13
+ in_order(root_node, attribute, [])
14
+ end
15
+
16
+ def in_order_string(root_node, attribute = nil)
17
+ in_order(root_node, attribute, []).join(', ')
18
+ end
19
+
20
+ def post_order_array(root_node, attribute = nil)
21
+ post_order(root_node, attribute, [])
22
+ end
23
+
24
+ def post_order_string(root_node, attribute = nil)
25
+ post_order(root_node, attribute, []).join(', ')
26
+ end
27
+
28
+ private
29
+
30
+ # The idea of preorder traversal is that we visit the nodes in the order root-left-right,
31
+ # meaning for any subtree in the path, root is processed as the node is visited, left node
32
+ # is visited second, followed by right node.
33
+ # If attribute is set then it is called as a method on the data stored
34
+ # in the node, and that value is added to the array. If not, the data is added.
35
+ def pre_order(node, attribute, node_list)
36
+ unless node.nil?
37
+ node_list << (attribute ? node.data.send(attribute) : node.data)
38
+ pre_order(node.left, attribute, node_list)
39
+ pre_order(node.right, attribute, node_list)
40
+ end
41
+ return node_list
42
+ end
43
+
44
+ # The idea of inorder traversal is that we visit the nodes in the order left-root-right,
45
+ # meaning for any subtree in the path, left node must be visited first followed by root
46
+ # and right node. Prints the values in ascending order.
47
+ # If attribute is set then it is called as a method on the data stored
48
+ # in the node, and that value is added to the array. If not, the data is added.
49
+ def in_order(node, attribute, node_list)
50
+ unless node.nil?
51
+ in_order(node.left, attribute, node_list)
52
+ node_list << (attribute ? node.data.send(attribute) : node.data)
53
+ in_order(node.right, attribute, node_list)
54
+ end
55
+ return node_list
56
+ end
57
+
58
+ # The idea of postorder traversal is that we visit the nodes in the order left-right-root,
59
+ # meaning for any subtree in the path, left node must be visited first, followed by the
60
+ # right node, and root is not processed until the children are.
61
+ # If attribute is set then it is called as a method on the data stored
62
+ # in the node, and that value is added to the array. If not, the data is added.
63
+ def post_order(node, attribute, node_list)
64
+ unless node.nil?
65
+ post_order(node.left, attribute, node_list)
66
+ post_order(node.right, attribute, node_list)
67
+ node_list << (attribute ? node.data.send(attribute) : node.data)
68
+ end
69
+ return node_list
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,11 @@
1
+ module Node
2
+ class Node
3
+ attr_accessor :data, :left, :right
4
+
5
+ def initialize(data)
6
+ @data = data
7
+ @left = nil
8
+ @right = nil
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module AVL
2
+ VERSION = '0.0'
3
+ end
@@ -0,0 +1,20 @@
1
+ require File.expand_path('../lib/ruby-avl/version', __FILE__)
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'ruby-avl'
5
+ s.version = AVL::VERSION
6
+ s.date = '2016-04-30'
7
+ s.description = s.summary = 'A simple AVL Tree implemented in Ruby'
8
+ s.authors = ['Daniel Byers']
9
+ s.email = 'daniel_byers@hotmail.co.uk'
10
+ s.homepage = 'http://rubygems.org/gems/ruby-avl'
11
+ s.license = 'MIT'
12
+
13
+ s.files = `git ls-files`.split("\n")
14
+ s.test_files = `git ls-files -- {test}/*`.split("\n")
15
+ s.require_path = 'lib'
16
+
17
+ s.add_development_dependency 'rake'
18
+ s.add_development_dependency 'rspec'
19
+ s.add_development_dependency 'rspec-given'
20
+ end
@@ -0,0 +1,121 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+
3
+ Given.use_natural_assertions
4
+
5
+ describe AVLTree::AVLTree do
6
+ Given(:node) { Node::Node.new(25) }
7
+
8
+ context 'initialize a AVL Tree with a null root' do
9
+ Then { subject.root == nil }
10
+ end
11
+
12
+ context 'initialize a AVL Tree with a root node' do
13
+ Given(:subject) { AVLTree::AVLTree.new(node) }
14
+ Then { subject.root == node }
15
+ end
16
+
17
+ context 'adding to AVL Tree with rebalancing' do
18
+
19
+ context 'left rotation' do
20
+ When(:result) {
21
+ subject.insert_item(25)
22
+ subject.insert_item(50)
23
+ subject.insert_item(100)
24
+ }
25
+ Then { result.data == 50 }
26
+ end
27
+
28
+ context 'double left rotation' do
29
+ When(:result) {
30
+ subject.insert_item(25)
31
+ subject.insert_item(50)
32
+ subject.insert_item(100)
33
+ subject.insert_item(80)
34
+ subject.insert_item(70)
35
+ subject.insert_item(57)
36
+ }
37
+ Then { result.data == 70 }
38
+ end
39
+
40
+ context 'right rotation' do
41
+ When(:result) {
42
+ subject.insert_item(25)
43
+ subject.insert_item(18)
44
+ subject.insert_item(7)
45
+ }
46
+ Then { result.data == 18 }
47
+ end
48
+
49
+ context 'double right rotation' do
50
+ When(:result) {
51
+ subject.insert_item(25)
52
+ subject.insert_item(18)
53
+ subject.insert_item(7)
54
+ subject.insert_item(13)
55
+ subject.insert_item(12)
56
+ subject.insert_item(17)
57
+ }
58
+ Then { result.data == 13 }
59
+ end
60
+
61
+ context 'no rotation' do
62
+ When(:result) {
63
+ subject.insert_item(25)
64
+ subject.insert_item(20)
65
+ subject.insert_item(30)
66
+ }
67
+ Then { result.data == 25 }
68
+ end
69
+ end
70
+
71
+ context 'removing from tree with rebalancing' do
72
+
73
+ When {
74
+ subject.insert_item(25)
75
+ subject.insert_item(50)
76
+ subject.insert_item(100)
77
+ subject.insert_item(80) # Visulisation:
78
+ subject.insert_item(70) # 70
79
+ subject.insert_item(57) # / \
80
+ subject.insert_item(72) # 50 80
81
+ subject.insert_item(77) # / \ / \
82
+ subject.insert_item(94) # 25 57 72 100
83
+ subject.insert_item(63) # \ \ \ /
84
+ subject.insert_item(30) # 30 63 77 94
85
+ }
86
+
87
+ context 'left rotation' do
88
+ When(:result) {
89
+ subject.remove_item(25)
90
+ subject.remove_item(30)
91
+ }
92
+ Then { result.left.data == 57 }
93
+ end
94
+
95
+ context 'right rotation' do
96
+ When(:result) {
97
+ subject.insert_item(20)
98
+ subject.remove_item(30)
99
+ subject.remove_item(57)
100
+ subject.remove_item(63)
101
+ }
102
+ Then { result.left.data == 25 }
103
+ end
104
+
105
+ context 'double left rotation rotation' do
106
+ When(:result) {
107
+ subject.remove_item(72)
108
+ subject.remove_item(77)
109
+ }
110
+ Then { result.right.data == 94 }
111
+ end
112
+
113
+ context 'double right rotation' do
114
+ When(:result) {
115
+ subject.remove_item(100)
116
+ subject.remove_item(94)
117
+ }
118
+ Then { result.right.data == 77 }
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,95 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+
3
+ Given.use_natural_assertions
4
+
5
+ describe BSTree::BSTree do
6
+ Given(:node) { Node::Node.new(1) }
7
+
8
+ context 'initialize a BS Tree with a null root' do
9
+ Then { subject.root == nil }
10
+ end
11
+
12
+ context 'initialize a BS Tree with a root node' do
13
+ Given(:subject) { BSTree::BSTree.new(node) }
14
+ Then { subject.root == node }
15
+ end
16
+
17
+ context 'number of nodes in a tree' do
18
+ When {
19
+ subject.insert_item(1)
20
+ subject.insert_item(2)
21
+ subject.insert_item(3)
22
+ }
23
+ When(:result) { subject.number_of_nodes }
24
+ Then { result == 3 }
25
+ end
26
+
27
+ context 'depth of the tree' do
28
+ When {
29
+ subject.insert_item(1)
30
+ subject.insert_item(2)
31
+ subject.insert_item(3)
32
+ }
33
+ When(:result) { subject.depth_of_tree }
34
+ Then { result == 2 }
35
+ end
36
+
37
+ context 'adding items to the tree' do
38
+
39
+ context 'add a single item to the tree' do
40
+ When(:result) { subject.insert_item(1) }
41
+ Then { result.data == 1 }
42
+ end
43
+
44
+ context 'add multiple items to the tree' do
45
+ When(:result) {
46
+ subject.insert_item(1)
47
+ subject.insert_item(2)
48
+ subject.insert_item(3)
49
+ subject.insert_item(4)
50
+ subject.insert_item(5)
51
+ }
52
+ Then { result.right.data == 2 }
53
+ end
54
+
55
+ context 'adding duplicates should be ignored' do
56
+ When(:result) {
57
+ subject.insert_item(1)
58
+ subject.insert_item(1)
59
+ }
60
+ Then { result.data == 1}
61
+ end
62
+ end
63
+
64
+ context 'removing items from the tree' do
65
+ When {
66
+ subject.insert_item(3) # Visulisation:
67
+ subject.insert_item(2) # 3
68
+ subject.insert_item(1) # / \
69
+ subject.insert_item(5) # 2 5
70
+ subject.insert_item(4) # / / \
71
+ subject.insert_item(6) # 1 4 6
72
+ }
73
+
74
+ context 'removing a leaf node' do
75
+ When(:result) { subject.remove_item(1) }
76
+ Then { result.left.left == nil }
77
+ end
78
+
79
+ context 'removing from a node with a left leaf' do
80
+ When(:result) { subject.remove_item(2) }
81
+ Then { result.left.data == 1 }
82
+ end
83
+
84
+ context 'removing from a node with a right leaf' do
85
+ When(:result) { subject.remove_item(6) }
86
+ Then { result.right.right == nil }
87
+ end
88
+
89
+ context 'removing from a node with two leaves' do
90
+ When(:result) { subject.remove_item(5) }
91
+ Then { result.right.right == nil }
92
+ And { result.right.left.data == 4 }
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,68 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+
3
+ Given.use_natural_assertions
4
+
5
+ describe BSTreeTraversal::BSTreeTraversal do
6
+ # Given returns the last node of the AVL Tree instead of the tree object itself.
7
+ # In production, avl_tree.root would need to be passed into the traversal methods.
8
+ Given(:avl_tree) {
9
+ avl_tree = AVLTree::AVLTree.new
10
+ avl_tree.insert_item(30) # Visulisation:
11
+ avl_tree.insert_item(10) # 23
12
+ avl_tree.insert_item(23) # / \
13
+ avl_tree.insert_item(55) # 10 47
14
+ avl_tree.insert_item(47) # / / \
15
+ avl_tree.insert_item(7) # 7 30 55
16
+ }
17
+
18
+ context 'AVL Tree pre order' do
19
+ context 'as array' do
20
+ When(:result) { subject.pre_order_array(avl_tree) }
21
+ Then { result == [23, 10, 7, 47, 30, 55] }
22
+ end
23
+
24
+ context 'as string' do
25
+ When(:result) { subject.pre_order_string(avl_tree) }
26
+ Then { result == '23, 10, 7, 47, 30, 55' }
27
+ end
28
+
29
+ context 'with certain attribute' do
30
+ When(:result) { subject.pre_order_string(avl_tree, :even) }
31
+ Then { result = 'False, True, False, False, True, False' }
32
+ end
33
+ end
34
+
35
+ context 'AVL Tree in order' do
36
+ context 'as array' do
37
+ When(:result) { subject.in_order_array(avl_tree) }
38
+ Then { result == [7, 10, 23, 30, 47, 55] }
39
+ end
40
+
41
+ context 'as string' do
42
+ When(:result) { subject.in_order_string(avl_tree) }
43
+ Then { result == '7, 10, 23, 30, 47, 55' }
44
+ end
45
+
46
+ context 'with certain attribute' do
47
+ When(:result) { subject.in_order_string(avl_tree, :even) }
48
+ Then { result = 'False, True, False, True, False, False' }
49
+ end
50
+ end
51
+
52
+ context 'AVL Tree post order' do
53
+ context 'as array' do
54
+ When(:result) { subject.post_order_array(avl_tree) }
55
+ Then { result == [7, 10, 30, 55, 47, 23] }
56
+ end
57
+
58
+ context 'as string' do
59
+ When(:result) { subject.post_order_string(avl_tree) }
60
+ Then { result == '7, 10, 30, 55, 47, 23' }
61
+ end
62
+
63
+ context 'with certain attribute' do
64
+ When(:result) { subject.post_order_string(avl_tree, :even) }
65
+ Then { result = 'False, True, True, False, False, False' }
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,12 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+
3
+ Given.use_natural_assertions
4
+
5
+ describe Node::Node do
6
+ context 'should initialize a new node' do
7
+ Given(:node) { Node::Node.new('test string') }
8
+ Then { node.data == 'test string' }
9
+ And { node.left == nil}
10
+ And { node.right == nil}
11
+ end
12
+ end
@@ -0,0 +1,28 @@
1
+ require 'rubygems'
2
+ require 'rspec/given'
3
+ require 'ruby-avl'
4
+
5
+ RSpec.configure do |config|
6
+ # rspec-expectations config goes here. You can use an alternate
7
+ # assertion/expectation library such as wrong or the stdlib/minitest
8
+ # assertions if you prefer.
9
+ config.expect_with :rspec do |expectations|
10
+ # This option will default to `true` in RSpec 4. It makes the `description`
11
+ # and `failure_message` of custom matchers include text for helper methods
12
+ # defined using `chain`, e.g.:
13
+ # be_bigger_than(2).and_smaller_than(4).description
14
+ # # => "be bigger than 2 and smaller than 4"
15
+ # ...rather than:
16
+ # # => "be bigger than 2"
17
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
18
+ end
19
+
20
+ # rspec-mocks config goes here. You can use an alternate test double
21
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
22
+ config.mock_with :rspec do |mocks|
23
+ # Prevents you from mocking or stubbing a method that does not exist on
24
+ # a real object. This is generally recommended, and will default to
25
+ # `true` in RSpec 4.
26
+ mocks.verify_partial_doubles = true
27
+ end
28
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-avl
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.0'
5
+ platform: ruby
6
+ authors:
7
+ - Daniel Byers
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-04-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec-given
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: A simple AVL Tree implemented in Ruby
56
+ email: daniel_byers@hotmail.co.uk
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - ".gitignore"
62
+ - Gemfile
63
+ - README.md
64
+ - Rakefile
65
+ - lib/ruby-avl.rb
66
+ - lib/ruby-avl/avl_tree.rb
67
+ - lib/ruby-avl/bs_tree.rb
68
+ - lib/ruby-avl/bs_tree_traversal.rb
69
+ - lib/ruby-avl/node.rb
70
+ - lib/ruby-avl/version.rb
71
+ - ruby-avl.gemspec
72
+ - spec/avl_tree_spec.rb
73
+ - spec/bs_tree_spec.rb
74
+ - spec/bs_tree_traversal_spec.rb
75
+ - spec/node_spec.rb
76
+ - spec/spec_helper.rb
77
+ homepage: http://rubygems.org/gems/ruby-avl
78
+ licenses:
79
+ - MIT
80
+ metadata: {}
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ requirements: []
96
+ rubyforge_project:
97
+ rubygems_version: 2.4.8
98
+ signing_key:
99
+ specification_version: 4
100
+ summary: A simple AVL Tree implemented in Ruby
101
+ test_files: []