Skip to content

Commit d94fd50

Browse files
committed
Use Struct instead of Node
1 parent 7933a68 commit d94fd50

File tree

2 files changed

+17
-24
lines changed

2 files changed

+17
-24
lines changed

lib/containers/deque.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
=end
77
class Containers::RubyDeque
88
include Enumerable
9+
10+
Node = Struct.new(:left, :right, :obj)
11+
912
# Create a new Deque. Takes an optional array argument to initialize the Deque.
1013
#
1114
# d = Containers::Deque.new([1, 2, 3])
@@ -158,7 +161,6 @@ def each_backward
158161
end
159162
alias_method :reverse_each, :each_backward
160163

161-
Node = Struct.new(:left, :right, :obj)
162164
end
163165

164166
begin

lib/containers/heap.rb

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
require 'containers/stack'
12
=begin rdoc
23
A Heap is a container that satisfies the heap property that nodes are always smaller in
34
value than their parent node.
@@ -12,6 +13,8 @@
1213
class Containers::Heap
1314
include Enumerable
1415

16+
Node = Struct.new(:key, :value, :degree, :marked, :parent, :child, :left, :right)
17+
1518
# call-seq:
1619
# size -> int
1720
#
@@ -59,7 +62,9 @@ def initialize(ary=[], &block)
5962
# heap.pop #=> 2
6063
def push(key, value=key)
6164
raise ArgumentError, "Heap keys must not be nil." unless key
62-
node = Node.new(key, value)
65+
node = Node.new(key, value, 0, false)
66+
node.left = node
67+
node.right = node
6368
# Add new node to the left of the @next node
6469
if @next
6570
node.right = @next
@@ -214,6 +219,12 @@ def pop
214219
# minheap.pop #=> 2
215220
# minheap.pop #=> 1
216221
def change_key(key, new_key, delete=false)
222+
stack = Containers::Stack.new
223+
stack.push @next
224+
until stack.empty?
225+
226+
end
227+
217228
return if @stored[key].nil? || @stored[key].empty? || (key == new_key)
218229

219230
# Must maintain heap property
@@ -232,7 +243,7 @@ def change_key(key, new_key, delete=false)
232243
if delete || @compare_fn[node.key, @next.key]
233244
@next = node
234245
end
235-
return [node.key, node.value]
246+
return node.key, node.value
236247
end
237248
nil
238249
end
@@ -253,25 +264,6 @@ def delete(key)
253264
pop if change_key(key, nil, true)
254265
end
255266

256-
# Node class used internally
257-
class Node # :nodoc:
258-
attr_accessor :parent, :child, :left, :right, :key, :value, :degree, :marked
259-
260-
def initialize(key, value)
261-
@key = key
262-
@value = value
263-
@degree = 0
264-
@marked = false
265-
@right = self
266-
@left = self
267-
end
268-
269-
def marked?
270-
@marked == true
271-
end
272-
273-
end
274-
275267
# make node a child of a parent node
276268
def link_nodes(child, parent)
277269
# link the child's siblings
@@ -336,8 +328,7 @@ def consolidate
336328
private :consolidate
337329

338330
def cascading_cut(node)
339-
p = node.parent
340-
if p
331+
if p = node.parent
341332
if node.marked?
342333
cut(node, p)
343334
cascading_cut(p)

0 commit comments

Comments
 (0)