Skip to content

Instantly share code, notes, and snippets.

@bastos
Created October 20, 2008 07:08
Show Gist options
  • Save bastos/18032 to your computer and use it in GitHub Desktop.
Save bastos/18032 to your computer and use it in GitHub Desktop.
Binary tree example!
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'rubygems'
class BinaryTree
attr_reader :root
# Por padrão busca por root primeiro
def search(value, node=@root)
if node == nil
return nil
elsif value < node.value
return search(value, node.left)
elsif value > node.value
return search(value, node.right)
else
return node
end
end
def traverse_inorder( node=@root, &block )
return if node.nil?
traverse_inorder( node.left, &block )
yield node
traverse_inorder( node.right, &block )
end
def traverse_preorder( node=@root, &block )
return if node.nil?
yield node
traverse_preorder( node.left, &block )
traverse_preorder( node.right, &block )
end
def traverse_postorder( node=@root, &block )
return if node.nil?
traverse_postorder( node.left, &block )
traverse_postorder( node.right, &block )
yield node
end
def add(value, node=@root)
if node == nil
node = BinaryTreeNode.new(value)
@root = node if not @root
return node
else
if value < node.value
node.left = add(value, node.left)
elsif value > node.value
node.right = add(value, node.right)
else
raise "Item duplicado"
end
return node
end
end
end
class BinaryTreeNode
attr_accessor :value, :left, :right, :is_root
def initialize(value)
@value = value
end
def left=(node)
puts "Adicionado #{node.value} a #{self.value} esquerda"
@left=node
end
def to_s
"#{@value}"
end
def right=(node)
puts "Adicionado #{node.value} a #{self.value} direita"
@right=node
end
end
#!/usr/bin/env ruby
require 'rubygems'
require 'open-uri'
require 'cgi'
require 'misc'
cgi = CGI.new() # New CGI object
puts "Content-type: text/html\n\n"
if cgi.has_key?('number_of')
number_of = cgi['number_of'].to_i
else
number_of = 3
end
nodes_inputs = ""
(1..number_of).each do |i|
nodes_inputs += "<p>Nó #{i} <input name=\"node[]\"/> </p>"
end
cgi.params['node[]'] = [10,3,11,40] unless cgi.include?('node[]')
begin
if cgi.params.has_key?('node[]')
tree = BinaryTree.new
cgi.params['node[]'].uniq.each do |e|
tree.add(e.to_i)
end
name = "#{ENV['REMOTE_ADDR']}"
if cgi.params.has_key?('find')
create_image_with_found_element(tree, tree.search(cgi['find'].to_i), name )
else
create_image(tree, name)
end
img = "<img src=\"#{name}.png\" alt=\"Árvore\">"
else
img = cgi.params
end
rescue => e
img = "<h1>ERRO #{e} :( Baleiando!<h1>"
end
puts <<END
<html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<title>arvore</title>
</head><body>
<form method="POST">
#{img}
<h1>Coloque os nós que você quer na árvore!</h1>
<div>Número de Nós: <input name="number_of" value="#{number_of}"/></div>
#{nodes_inputs}
<div>Encontrar: <input name="find"/></div>
<input type="submit" value="Enviar"/>
</form>
</body></html>
END
require 'arvore'
require 'graphviz'
def create_image(tree, name="teste")
g = GraphViz::new( "G" )
tree.traverse_preorder do |node|
ngnode = g.add_node(node.to_s)
if node.left
ngnode << g.add_node(node.left.to_s)
end
if node.right
ngnode << g.add_node(node.right.to_s)
end
end
g.output( :output => "png", :file => "#{name}.png" )
end
def create_image_with_found_element(tree, found, name="teste")
g = GraphViz::new( "G" )
tree.traverse_preorder do |node|
if found == node
ngnode = g.add_node(node.to_s, :shape => "box", :style => "filled", :color => ".7 .3 1.0")
else
ngnode = g.add_node(node.to_s)
end
if node.left
if found == node.left
ngnode << g.add_node(node.left.to_s, :shape => "box", :style => "filled", :color => ".7 .3 1.0")
else
ngnode << g.add_node(node.left.to_s)
end
end
if node.right
if found == node.right
ngnode << g.add_node(node.right.to_s, :shape => "box", :style => "filled", :color => ".7 .3 1.0")
else
ngnode << g.add_node(node.right.to_s)
end
end
end
g.output( :output => "png", :file => "#{name}.png" )
end
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'arvore'
require 'graphviz'
def create_image(tree, name="teste")
g = GraphViz::new( "G" )
tree.traverse_preorder do |node|
ngnode = g.add_node(node.to_s)
if node.left
ngnode << g.add_node(node.left.to_s)
end
if node.right
ngnode << g.add_node(node.right.to_s)
end
end
g.output( :output => "png", :file => "#{name}.png" )
end
def create_image_with_found_element(tree, found, name="teste")
g = GraphViz::new( "G" )
tree.traverse_preorder do |node|
if found == node
ngnode = g.add_node(node.to_s, :shape => "box", :style => "filled", :color => ".7 .3 1.0")
else
ngnode = g.add_node(node.to_s)
end
if node.left
if found == node
ngnode << g.add_node(node.left.to_s, :shape => "box", :style => "filled", :color => ".7 .3 1.0")
else
ngnode << g.add_node(node.left.to_s)
end
end
if node.right
if found == node
ngnode << g.add_node(node.right.to_s, :shape => "box", :style => "filled", :color => ".7 .3 1.0")
else
ngnode << g.add_node(node.right.to_s)
end
end
end
g.output( :output => "png", :file => "#{name}.png" )
end
tree = BinaryTree.new
(1..20).each { |i|
begin
tree.add(rand(100))
rescue
# pass
end
}
create_image(tree, name="teste")
create_image_with_found_element(tree, tree.search(rand(100)), "found")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment