繁体   English   中英

Ruby 中的二叉搜索树插入方法

[英]Binary Search Tree Insertion method in Ruby

我正在研究数据结构,但遇到了其中一项挑战。 目标是将数组元素根据其值插入二叉搜索树,即(主树的root_node为array[0],左子树的root_node小于父节点,右子树的root_node大于父节点)。 这将递归完成,直到所有数组元素都插入到 BST 中。

我已经实现了两个类:

  1. 表示具有属性(数据、左、右)的节点:
class Node
  attr_reader :data
  attr_accessor :left, :right

  def initialize(data)
    @data = data
  end
end
  1. 表示根值为 nil 的二叉搜索树的 BST 类:
class BST
  attr_accessor :root

  def initialize
    @root = nil
  end

  def insert(node)
    insert_node(@root, node)
  end

  def pre_order(node = @root)
    return '' if node.nil?

    print "#{node.data} "
    pre_order(node.left)
    pre_order(node.right)
  end

  private

  def insert_node(node, element)
    if node.nil?
      node = element
    elsif node.data > element.data
      node.left = insert_node(node.left, element)
    else
      node.right = insert_node(node.right, element)
    end

    node
  end
end
  • insert_node是 BST 的私有方法,它执行将节点插入树的实际工作。 由于对使用 RSpec 进行评估的预期解决方案的要求,我将其与insert分开。
  • 然后我做了一个pre_order遍历,将每个 Node 打印到终端窗口。
  1. 我有一个binary_search_tree方法,它接受一个array作为输入并在每个数组元素上调用insert方法。 它的主要功能是将数组转换为二叉树并以pre_order格式打印出所有树节点。
def binary_search_tree(array)
  tree = BST.new
  array.each { |e| tree.insert(Node.new(e)) }
  tree.pre_order
end

如果我使用[8, 3, 10, 1, 6, 14, 4, 7, 13]作为参数运行binary_search_tree方法,我希望以格式# => "8 3 1 6 4 7 10 14 13"但什么也没发生,我不知道我可能哪里出错了。 今天我已经被这个挑战困住了几个小时,如果有人能提供帮助,那将意义重大。 谢谢 : )

样本输入:

puts binary_search_tree([8, 3, 10, 1, 6, 14, 4, 7, 13])

预期输出:

8 3 1 6 4 7 10 14 13

得到了:

return '' if node.nil?

这是递归pre_order的停止条件,它是您从binary_search_tree返回的binary_search_tree 您似乎没有任何东西可以将您的树格式化为您想要的形状, "8 3 1 6 4 7 10 14 13" 因此,添加该逻辑并在binary_search_tree方法的末尾调用它。

哦,我终于找到了解决挑战的方法。 我只是要演示我是如何做的以供将来参考:

因此,我没有使用两个单独的方法insertinsert_helper node,而是决定去掉多余的代码,并想出了一种方法来解决这个挑战。 这是 BST 类结构:

class BST
  attr_accessor :root

  def initialize
    @root = nil
  end

  def insert(node, head = @root)
    return @root = node if @root.nil?

    return node if head.nil?

    if node.data < head.data
      head.left = insert(node, head.left)
    elsif node.data > head.data
      head.right = insert(node, head.right)
    end

    head
  end

  def pre_order(node = @root)
    return '' if node.nil?

    result = ''
    result += "#{node.data} "
    result += pre_order(node.left)
    result += pre_order(node.right)
  end
end

insert方法现在接受两个参数node and ( head是一个可选参数),以允许我们对子树节点执行递归操作并产生所需的结果。

pre_order打印每个节点的数据,这是在递归方法中完成的,因此二叉搜索树中的每个节点都以 pre_order 格式打印出来。

现在,如果您调用 BST pre_order 方法,例如:

def binary_search_tree(array)
  tree = BST.new
  array.each { |e| tree.insert(Node.new(e)) }
  tree.pre_order
end

puts binary_search_tree([8, 3, 10, 1, 6, 14, 4, 7, 13])

你得到结果8 3 1 6 4 7 10 14 13 通过改变pre_order方法,您可以在post_orderinorder等中打印树节点

我希望这对其他人有用。 快乐编码!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM