On Apr 21, 12:26 am, Dan Zwell <dzw... / gmail.com> wrote:
> 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

Hi Dan,

You're right, the problematic line is definitely: node = newNode.

When the tree has no root (@root == nil), the first node added to the
tree should become the root. That's why I check just before if the
node is nil. Since this method is called by insert which pass to
insertNode the class attribute @root, why Ruby doesn't change the
value of @root for the value of newNode. I thought that Ruby was using
only references... Am I right?

Thank you for your help...

Martin