Tomasz Kasperek
Tomasz Kasperek

Reputation: 1187

How to remove object in Ruby

I've implemented Binary search tree in ruby, and now I need to clean whole structure but I can't find any way to do that.

def post_order_clean(node)
  if node.left != nil
    post_order_clean(node.left)
  end

  if node.right != nil
    post_order_clean(node.right)
  end

  node = nil
end

But when i do sth like that:

example = [4,6,9,5,7,3,1]

tree = BST::BinaryTree.new(example)
tree.clean
puts tree.root.value

It still prints out 4 as a root value. How can I clean the tree with post-order traversing method?

Edit:

Just like @Cary Swoveland mentioned:

.. successively remove nodes (together with arcs directed to the node) that have no arcs directed to other nodes.

That's my point.

Upvotes: 1

Views: 746

Answers (1)

Viktor Oleksyn
Viktor Oleksyn

Reputation: 624

I did this solution for insert and remove:

class TreeNode
    attr_accessor :val, :left, :right
    def initialize(val)
        @val = val
        @left, @right = nil, nil
    end

    def insert(v)
        side = (v <= val ? :left : :right)

        if send(side)
            send(side).insert(v)
        else
            send("#{side}=", TreeNode.new(v))
        end
    end

    def delete(v)
        if v < val
            self.left = self.left ? self.left.delete(v) : nil
        elsif v > val
            self.right = self.right ? self.right.delete(v) : nil
        else
            if self.left.nil?
                return self.right
            elsif self.right.nil?
                return self.left
            end

            min = self.right
            min = min.left while !min.left.nil?

            self.val = min.val
            self.right = self.right.delete(self.val)
        end
        self
    end
end

Upvotes: 1

Related Questions