Mega Code Archive

 
Categories / Ruby / Collections
 

Search a tree

class Tree   attr_accessor :left   attr_accessor :right   attr_accessor :data   def initialize(x=nil)     @left = nil     @right = nil     @data = x   end   def insert(x)     list = []     if @data == nil       @data = x     elsif @left == nil       @left = Tree.new(x)     elsif @right == nil       @right = Tree.new(x)     else       list << @left       list << @right       loop do         node = list.shift         if node.left == nil           node.insert(x)           break         else           list << node.left         end         if node.right == nil           node.insert(x)           break         else           list << node.right         end       end     end   end   def traverse()     list = []     yield @data     list << @left if @left != nil     list << @right if @right != nil     loop do       break if list.empty?       node = list.shift       yield node.data       list << node.left if node.left != nil       list << node.right if node.right != nil     end   end   def insert(x)     if @data == nil       @data = x     elsif x <= @data       if @left == nil         @left = Tree.new x       else         @left.insert x       end     else       if @right == nil         @right = Tree.new x       else         @right.insert x       end     end   end   def inorder()     @left.inorder {|y| yield y} if @left != nil     yield @data     @right.inorder {|y| yield y} if @right != nil   end   def preorder()     yield @data     @left.preorder {|y| yield y} if @left != nil     @right.preorder {|y| yield y} if @right != nil   end   def postorder()     @left.postorder {|y| yield y} if @left != nil     @right.postorder {|y| yield y} if @right != nil     yield @data   end   def search(x)     if self.data == x       return self     elsif x < self.data       return left != nil ? left.search(x) : nil     else       return right != nil ? right.search(x) : nil     end   end end keys = [50, 20, 80, 10, 30, 70, 90, 5, 14,         28, 41, 66, 75, 88, 96] tree = Tree.new keys.each {|x| tree.insert(x)} s1 = tree.search(75)   # Returns a reference to the node                        # containing 75... s2 = tree.search(100)  # Returns nil (not found)