Binary_tree.rb

This content was produced by an LLM and could include errors.

This script defines a Binary Search Tree (BST) in Ruby. It includes methods to construct, insert, delete, and perform inorder traversal on the self-balancing tree structure.

# frozen_string_literal: true
#=> nil

class Node
  attr_accessor :item, :left, :right
  def initialize(item)
    @item = item
    @left = nil
    @right = nil
  end
end
#=> :initialize

def insert_node(node, ele)
  return Node.new(ele) if node.nil?
  
  if ele < node.item
    node.left = insert_node(node.left, ele)
    else
    node.right = insert_node(node.right, ele)
  end
  node
end
#=> :insert_node

def delete_node(node, val)
  return nil if node.nil?
  
  if val < node.item
    node.left = delete_node(node.left, val)
    elsif val > node.item
    node.right = delete_node(node.right, val)
    else
    return nil if node.left.nil? && node.right.nil?
    
    min_larger_right = find_min(node.right)
    node.item = min_larger_right.item
    node.right = delete_node(node.right, min_larger_right.item)
  end
  node
end
#=> :delete_node

def find_min(node)
  node = node.left while node.left
  node
end
#=> :find_min

def make_binary_tree(data)
  btree = nil
  data.each do |ele|
    btree = insert_node(btree, ele)
  end
  btree
end
#=> :make_binary_tree

def print_with_inorder(btree)
  return if btree.nil?
  
  print_with_inorder(btree.left)
  puts btree.item
  print_with_inorder(btree.right)
end
#=> :print_with_inorder

def inorder_to_array(btree)
  return [] if btree.nil?
  
  inorder_to_array(btree.left) + [btree.item] + inorder_to_array(btree.right)
end
#=> :inorder_to_array
data = 3.times.to_a.shuffle
#=> [0, 2, 1]

# make tree
#=> nil
btree = make_binary_tree(data)
#=> #<Node:0x00007faf2a155ca8
#...

# inorder
#=> nil
p inorder_to_array(btree)
[0, 1, 2]
#=> [0, 1, 2]

# insert
#=> nil
insert_node(btree, 123)
#=> #<Node:0x00007faf2a155ca8
# @item=0,
# @left=nil,
# @right=
  #<Node:0x00007faf2a155be0
   @item=2,
   @left=#<Node:0x00007faf2a155b68 @item=1, @left=nil, @right=nil>,
   @right=#<Node:0x00007faf2a30c600 @item=123, @left=nil, @right=nil>>>
p inorder_to_array(btree)
[0, 1, 2, 123]
#=> [0, 1, 2, 123]

# delete
#=> nil
delete_node(btree, 0)
#=> #<Node:0x00007faf2a155ca8
# @item=1,
# @left=nil,
# @right=
  #<Node:0x00007faf2a155be0
   @item=2,
   @left=nil,
   @right=#<Node:0x00007faf2a30c600 @item=123, @left=nil, @right=nil>>>
p inorder_to_array(btree)
[1, 2, 123]
#=> [1, 2, 123]



Ruby 4.0.3