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.
1213class 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