Binary Tree in Ruby
Sorce Bank 2010. 3. 14. 08:55
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 |


