87 lines
1.5 KiB
Ruby
87 lines
1.5 KiB
Ruby
# This file contains the Ruby code from book of
|
|
# "Data Structures and Algorithms
|
|
# with Object-Oriented Design Patterns in Ruby"
|
|
# by Bruno R. Preiss.
|
|
#
|
|
# Copyright (c) 2004 by Bruno R. Preiss, P.Eng. All rights reserved.
|
|
|
|
class BinarySearchTree < BinaryTree
|
|
|
|
include SearchTreeMethods
|
|
|
|
def initialize(*args)
|
|
super
|
|
end
|
|
|
|
def find(obj)
|
|
return nil if empty?
|
|
diff = obj <=> @key
|
|
if diff == 0
|
|
return @key
|
|
elsif diff < 0
|
|
return @left.find(obj)
|
|
elsif diff > 0
|
|
return @right.find(obj)
|
|
end
|
|
end
|
|
|
|
def min
|
|
if empty?
|
|
return nil
|
|
elsif @left.empty?
|
|
return @key
|
|
else
|
|
return @left.min
|
|
end
|
|
end
|
|
|
|
def insert(obj)
|
|
if empty?
|
|
attachKey(obj)
|
|
else
|
|
diff = obj <=> @key
|
|
if diff == 0
|
|
raise ArgumentError
|
|
elsif diff < 0
|
|
@left.insert(obj)
|
|
elsif diff > 0
|
|
@right.insert(obj)
|
|
end
|
|
end
|
|
balance
|
|
end
|
|
|
|
def attachKey(obj)
|
|
raise StateError if not empty?
|
|
@key = obj
|
|
@left = BinarySearchTree.new
|
|
@right = BinarySearchTree.new
|
|
end
|
|
|
|
def balance
|
|
end
|
|
|
|
def withdraw(obj)
|
|
raise ArgumentError if empty?
|
|
diff = obj <=> @key
|
|
if diff == 0
|
|
if not @left.empty?
|
|
max = @left.max
|
|
@key = max
|
|
@left.withdraw(max)
|
|
elsif not @right.empty?
|
|
min = @right.min
|
|
@key = min
|
|
@right.withdraw(min)
|
|
else
|
|
detachKey
|
|
end
|
|
elsif diff < 0
|
|
@left.withdraw(obj)
|
|
elsif diff > 0
|
|
@right.withdraw(obj)
|
|
end
|
|
balance
|
|
end
|
|
|
|
end |