adt_utilit 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5e8ee1f39f314d0f7ca04f595bd4b474d361aa2f
4
- data.tar.gz: 9e26d7ba45ad54ddb0bff7b5f4860e146957a415
3
+ metadata.gz: 24a8c1885ed5a72b48d7407890a5ba8258eddb41
4
+ data.tar.gz: 91762ad975b58dd73ad3e817b832a39d9946f778
5
5
  SHA512:
6
- metadata.gz: e13664fee3e3cfcf5b2587d966accf1f2c7ab520d921109a161fae1f57098a2c57b1389c6a35994866713f10955890497afab20353b547f15030dcadc7a47a3f
7
- data.tar.gz: cf2dfcd78512d7de2110ab393c3acb621a5d97b97deb12baa38d27c57af897c8e26bf3da5e9a8ad1f8290369855ef25ca8e86ea635e9641784ef74d39f798880
6
+ metadata.gz: 033d3b191e848a08d2aed9aee6880a23a8b85690d196b462a3f32ce0e28c79c871392d79a247dcbb8d89fbfc938923067e570a1e4c18401984878fcd1b9595a3
7
+ data.tar.gz: 5a962e15cdd3a06ab893465262e99a402ac5636b1a7f5c7c020de415f483426263d4b6aa229962ede029853cf68bdb76ed25ca7960bc1132d9a98969ad47ad1a
@@ -1,5 +1,6 @@
1
1
  require 'adt_utilit/linked_list'
2
2
  require 'adt_utilit/stack_queue'
3
+ require 'adt_utilit/binary_tree_node'
3
4
 
4
5
  class AdtUtilit
5
6
 
@@ -0,0 +1,125 @@
1
+ require_relative "graph_node"
2
+ require 'byebug'
3
+
4
+ class BinaryTreeNode < GraphNode
5
+ attr_reader :parent
6
+
7
+ protected
8
+ attr_writer :parent
9
+
10
+ public
11
+ def initialize(value)
12
+ super(value)
13
+ end
14
+
15
+ def left_child
16
+ @children[0]
17
+ end
18
+
19
+ def right_child
20
+ @children[1]
21
+ end
22
+
23
+ def connect(node)
24
+ if @children.length >= 2
25
+ raise "BinaryTreeNode can have only two children"
26
+ end
27
+ if node.children.include?(self)
28
+ raise "Undirected edges are not allowed in binary tree"
29
+ end
30
+ super(node)
31
+ end
32
+
33
+ # def switch(node)
34
+ # unless self.children.include?(node)
35
+ # raise "No parent-child relationship exists"
36
+ # end
37
+ # replace_idx = self.children.find_index(node)
38
+ # self.children, node.children = node.children, self.children
39
+ # node.children[replace_idx] = self
40
+ #
41
+ # if self.parent.nil?
42
+ # node.parent = nil
43
+ # else
44
+ # replace_idx = self.parent.children.find_index(self)
45
+ # self.parent, node.parent = node, self.parent
46
+ # node.parent.children[replace_idx] = node
47
+ # end
48
+ # node.children.each{|child| child.parent = node}
49
+ # # debugger
50
+ # end
51
+
52
+ def filled?
53
+ !!(left_child && right_child)
54
+ end
55
+
56
+ def trav_in_order(search_value = nil, &prc)
57
+ if (search_value.nil? && !block_given?) || (search_value && block_given?)
58
+ raise "Wrong number of argument"
59
+ end
60
+ prc = Proc.new{ |val| val == search_value } if search_value
61
+
62
+ result = left_child ? left_child.trav_in_order(nil, &prc) : nil
63
+ return result unless result.nil?
64
+
65
+ result = prc.call(self.value) ? self : nil
66
+ return result unless result.nil?
67
+
68
+ result = right_child ? right_child.trav_in_order(nil, &prc) : nil
69
+ return result unless result.nil?
70
+
71
+ nil
72
+ end
73
+
74
+ def trav_pre_order(search_value = nil, &prc)
75
+ if (search_value.nil? && !block_given?) || (search_value && block_given?)
76
+ raise "Wrong number of argument"
77
+ end
78
+ prc = Proc.new{ |val| val == search_value } if search_value
79
+
80
+ result = prc.call(self.value) ? self : nil
81
+ return result unless result.nil?
82
+
83
+ result = left_child ? left_child.trav_pre_order(nil, &prc) : nil
84
+ return result unless result.nil?
85
+
86
+ result = right_child ? right_child.trav_pre_order(nil, &prc) : nil
87
+ return result unless result.nil?
88
+
89
+ nil
90
+ end
91
+
92
+ def trav_post_order(search_value = nil, &prc)
93
+ if (search_value.nil? && !block_given?) || (search_value && block_given?)
94
+ raise "Wrong number of argument"
95
+ end
96
+ prc = Proc.new{ |val| val == search_value } if search_value
97
+
98
+ result = left_child ? left_child.trav_post_order(nil, &prc) : nil
99
+ return result unless result.nil?
100
+
101
+ result = right_child ? right_child.trav_post_order(nil, &prc) : nil
102
+ return result unless result.nil?
103
+
104
+ result = prc.call(self.value) ? self : nil
105
+ return result unless result.nil?
106
+ nil
107
+ end
108
+
109
+ def _trav_right_first(search_value = nil, &prc)
110
+ if (search_value.nil? && !block_given?) || (search_value && block_given?)
111
+ raise "Wrong number of argument"
112
+ end
113
+ prc = Proc.new{ |val| val == search_value } if search_value
114
+
115
+ result = right_child ? right_child._trav_right_first(nil, &prc) : nil
116
+ return result unless result.nil?
117
+
118
+ result = left_child ? left_child._trav_right_first(nil, &prc) : nil
119
+ return result unless result.nil?
120
+
121
+ result = prc.call(self) ? self : nil
122
+ return result unless result.nil?
123
+ nil
124
+ end
125
+ end
@@ -0,0 +1,96 @@
1
+ require 'set'
2
+ require 'byebug'
3
+ class GraphNode
4
+ attr_reader :children, :value
5
+
6
+ protected
7
+ attr_writer :children
8
+
9
+ public
10
+ def initialize(value)
11
+ @value = value
12
+ @children = []
13
+ end
14
+
15
+ def connect(node)
16
+ @children << node
17
+ end
18
+
19
+ def remove(node)
20
+ result = @children.delete(node){nil}
21
+ result.nil? ? nil : node
22
+ end
23
+
24
+ def remove_all
25
+ @children = []
26
+ end
27
+
28
+ def dfs(search_value = nil, searched = Set.new, &prc)
29
+ if (search_value && block_given?) || (search_value.nil? && !block_given?)
30
+ raise "Wrong number of argument"
31
+ end
32
+ prc = Proc.new{ |val| val == search_value } if search_value
33
+
34
+ if prc.call(self.value)
35
+ return self
36
+ else
37
+ searched.add(self)
38
+ end
39
+
40
+ return nil if @children.empty?
41
+
42
+ @children.each do |child_node|
43
+ return nil if searched.include?(child_node)
44
+ result = child_node.dfs(nil, searched, &prc)
45
+ return result if !result.nil?
46
+ searched.add(child_node)
47
+ end
48
+ return nil
49
+ end
50
+
51
+ def bfs(search_value = nil, searched = Set.new, &prc)
52
+ if (search_value && block_given?) || (search_value.nil? && !block_given?)
53
+ raise "Wrong number of argument"
54
+ end
55
+ prc = Proc.new{ |val| val == search_value } if search_value
56
+
57
+ search_queue = [self]
58
+ until search_queue.empty?
59
+ node = search_queue.shift
60
+ return node if prc.call(node.value)
61
+ searched.add(node)
62
+
63
+ if node.children.length > 0
64
+ node.children.each do |child|
65
+ search_queue << child unless searched.include?(child)
66
+ end
67
+ end
68
+ end
69
+ return nil
70
+
71
+ end
72
+
73
+ def _bfs(search_value = nil, searched = Set.new, &prc)
74
+ if (search_value && block_given?) || (search_value.nil? && !block_given?)
75
+ raise "Wrong number of argument"
76
+ end
77
+ prc = Proc.new{ |val| val == search_value } if search_value
78
+
79
+ search_queue = [self]
80
+ until search_queue.empty?
81
+ node = search_queue.shift
82
+ return node if prc.call(node)
83
+ searched.add(node)
84
+
85
+ if node.children.length > 0
86
+ node.children.each do |child|
87
+ search_queue << child unless searched.include?(child)
88
+ end
89
+ end
90
+ end
91
+ return nil
92
+
93
+ end
94
+
95
+
96
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adt_utilit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hirosvk
@@ -19,6 +19,8 @@ extensions: []
19
19
  extra_rdoc_files: []
20
20
  files:
21
21
  - lib/adt_utilit.rb
22
+ - lib/adt_utilit/binary_tree_node.rb
23
+ - lib/adt_utilit/graph_node.rb
22
24
  - lib/adt_utilit/linked_list.rb
23
25
  - lib/adt_utilit/linked_list_node.rb
24
26
  - lib/adt_utilit/queue.rb