Binary Tree in Ruby

Node.rb
class Node
  attr_accessor :data, :rightChild, :leftChild, :parent
  def initialize data
    @parent=nil
    @data=data
    @rightChild=nil
    @leftChild=nil
  end
end
BinaryTree.rb
require 'Node'

class BinaryTree
  attr_reader :root
  @@NilNode=Node.new(nil)
  def initialize
    @root=@@NilNode
  end

  def insert data
    if @root==@@NilNode
      # When first Node insert
      @root=makeNode(data,@@NilNode)
    else
      nextNode=@root
      loop do
        if nextNode.data > data
          if nextNode.leftChild==@@NilNode
            nextNode.leftChild=makeNode(data,nextNode)
            return true
          end
          nextNode= nextNode.leftChild
        elsif nextNode.data < data
          if nextNode.rightChild==@@NilNode
            nextNode.rightChild=makeNode(data,nextNode)
            return true
          end
          nextNode=nextNode.rightChild
        elsif nextNode.data==data
          puts "Dupplicate value. : #{data}"
          return false
        end
      end
    end
  end

  def makeNode d,p
    node=Node.new d
    node.rightChild=@@NilNode
    node.leftChild=@@NilNode
    node.parent=p
    return node
  end

  def delete data
    target=@root
    until target==@@NilNode
      if target.data>data
        target=target.leftChild
      elsif target.data < data
        target=target.rightChild
      else
        if target.leftChild==@@NilNode and target.rightChild==@@NilNode
          # When target is Leaf Node
          target.parent.leftChild=@@NilNode if target.parent.leftChild==target
          target.parent.rightChild=@@NilNode if target.parent.rightChild==target
          return true
        elsif target.leftChild!=@@NilNode and target.rightChild!=@@NilNode
          # When target has two Childs
          exchangeNode=target.leftChild
          until exchangeNode.rightChild == @@NilNode
            exchangeNode= exchangeNode.rightChild
          end
          delete exchangeNode.data
          target.data = exchangeNode.data
          return true
        else
          # When target has a Child
          if target.leftChild==@@NilNode
            target.rightChild.parent=target.parent
            target.parent.leftChild=target.rightChild if target.parent.leftChild==target
            target.parent.rightChild=target.rightChild if target.parent.rightChild==target
            return true
          else
            target.leftChild.parent=target.parent
            target.parent.leftChild=target.leftChild if target.parent.leftChild==target
            target.parent.rightChild=target.leftChild if target.parent.rightChild==target
            return true
          end
        end
      end
    end
    puts "없는값 검색"
    return false
  end

  def inorder n,show
    if n==@@NilNode
      return
    end
    show.call("InOrder :") if n==@root
    inorder n.leftChild,show
    show.call(n.data)
    inorder n.rightChild,show
  end

  def preorder n,show
    if n==@@NilNode
      return
    end
    show.call("PreOrder :") if n==@root
    show.call(n.data)
    preorder n.leftChild,show
    preorder n.rightChild,show
  end

  def postorder n,show
    if n==@@NilNode
      return
    end
    show.call("PostOrder :") if n==@root
    postorder n.leftChild,show
    postorder n.rightChild,show
    show.call(n.data)
  end
end

'Sorce Bank' 카테고리의 다른 글

Java Binary Tree  (0) 2010.03.14
Python Client  (0) 2010.03.14
Python Server  (0) 2010.03.14
PL_HW01-3 in Perl  (0) 2010.03.14
PL HW 01_2 in perl  (0) 2010.03.14