```On 2005-07-22 22:05:26 +0900, Ruby Quiz wrote:
[Quiz #40]

Implementation:

class HeapVisualizer
def initialize(heap)
@heap = heap.instance_variable_get(:@heap)[1..-1]
end

def to_s
@curved = [ ]
recurse
end

private

def recurse(node = 0, level = 0)
result = ''
return result unless @heap[node]
for l in 0 ... level
result << if @curved[l]
l == level - 1 ? '`---' : ' ' * 4
else
l == level - 1 ? '+---' : '|   '
end
end
result << "#{@heap[node]}\n"
left, right = (node << 1) + 1, (node << 1) + 2
if @heap[left]
@curved[level] = @heap[right] ? false : true
result << recurse(left, level + 1)
if @heap[right]
@curved[level] = true
result << recurse(right, level + 1)
end
end
result
end
end

Usage:

def to_s(  )
HeapVisualizer.new(self).to_s
end

Output:

12
+---20
|   +---29
|   |   +---35
|   |   `---40
|   `---23
|       +---26
|       `---51
`---15
+---17
|   `---19
`---22
12
+---20
|   +---29
|   |   +---35
|   |   `---40
|   `---23
|       +---26
|       `---51
`---13
+---15
|   +---19
|   `---17
`---22
13
+---20
|   +---29
|   |   +---35
|   |   `---40
|   `---23
|       +---26
|       `---51
`---15
+---17
|   `---19
`---22

--
Florian Frank

```