Martin wrote:
> Hi all!
> 
> I'm a newbie in Ruby and I am trying to implement a Binary Tree.
> However, it doesn't work. Could someone please help me?
> 
> Thank you !
> 
> class Node
>   attr_accessor :left, :right, :key, :data
> 
>   def initialize(key, data)
>     @left = nil
>     @right = nil
>     @key = key
>     @data = data
>   end
> 
>   def to_s()
>     print "Key = ", @key, " Data = ", @data
>   end
> end
> 
> class Tree
>   attr_accessor :root
> 
> public
>   def initialize()
>     @root = nil
>     print "Root Object Id ", @root.object_id, "\n"
>   end
> 
>   def insert(newNode)
>     insertNode(@root, newNode)
>   end
> 
>   def visit()
>     visitNode(@root)
>   end
> 
> private
>   def insertNode(node, newNode)
>     print "Node Object Id ", node.object_id, "\n"
>      print "New Node Object Id ", newNode.object_id, "\n"
>     if (node == nil)
>       node = newNode
>        print "Node Affected Object Id ", node.object_id, "\n"
>     print @root
>         print node
>     else
>       if (newNode.data <= node.data)
>         insertNode(node.left, newNode)
>         print "Gauche"
>       else
>         insertNode(node.right, newNode)
>         print "Droite"
>       end
>     end
>   end
> 
>   def visitNode(node)
>     if (node != nil)
>       print node.key
> 
>       if (node.left != nil)
>         visitNode(node.left)
>       end
> 
>       if (node.right != nil)
>         visitNode(node.right )
>       end
>     end
>   end
> end
> 
> 
> arbre = Tree.new
> arbre.insert(Node.new(1, "un"))
> arbre.insert(Node.new(2, "deux"))
> arbre.insert(Node.new(3, "trois"))
> 
> arbre.visit()
> 

Martin,

In short, I don't know how to fix it. But the problem is with this line:

node = newNode

It doesn't seem to do what you want. I think it takes the reference 
variable "node" (previously pointing at @root, until the method 
recurses) and point it at a new variable ("newNode"). That isn't what 
you want--you want to replace the contents of the node, not change the 
reference. I don't know how to do this. I got something by changing the 
above line to "@root = newNode", but that really breaks the algorithm.

Dan Zwell