当前位置: 首页 > 知识库问答 >
问题:

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

濮阳唯
2023-03-14

我正在研究数据结构,我遇到了一个难题。目标是根据数组元素的值将数组元素插入到二叉搜索树中,即(主树的根节点为数组[0],左子树的根_node小于父节点,右子树的根节点大于父节点)。这将递归进行,直到所有数组元素都插入BST。

我实现了两个类:

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

  def initialize(data)
    @data = data
  end
end
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评估的预期解决方案。
  • 然后,我做了一个pre_order遍历,将每个节点打印到终端窗口。
def binary_search_tree(array)
  tree = BST.new
  array.each { |e| tree.insert(Node.new(e)) }
  tree.pre_order
end

如果我使用< code>[8,3,10,1,6,14,4,7,13]作为参数运行< code>binary_search_tree方法,我希望以< code># =

样本输入:

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

预期产出:

8 3 1 6 4 7 10 14 13

得到了:

共有2个答案

赵钊
2023-03-14
return '' if node.nil?

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

边银龙
2023-03-14

哦,我终于找到了一个绕过挑战的方法。我将演示我是如何做到的,以供将来参考:

因此,我决定去掉冗余代码并想出一种方法来解决这个挑战,而不是使用两个单独的方法插入insert_helper节点。这是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

< code>insert方法现在接受两个参数< code>node和(< code>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等中打印树节点。

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

 类似资料:
  • 二叉搜索树(BST)和二叉树(BT)中的插入有什么区别?我知道,在BST中,您将新节点的值与根进行比较,如果较小,则添加到其左侧,如果较大,则将其添加到根的右侧。BT的程序是否相同?如果没有,插入和移除的步骤是什么?

  • 我搜索了一下,但没有找到这个问题的答案... 我构建了一个非二叉树,因此每个节点可以有任意数量的子节点(我认为称为n元树) 为了有助于搜索,我在构建树的时候给了每个节点一个编号,这样每个节点的子节点会更大,它右边的所有节点也会更大。 像这样的东西: 这样我就有更多的时间进行搜索 当我想插入节点时,问题就来了。如果我想在除了结尾以外的任何地方插入节点,这个模型就不起作用了。 我想了几种方法可以做到这

  • public static void main(String[]args){main main=new main();

  • 我有一个Java中的二叉搜索树作业,其中给了我完整的树和节点类,还有一个SearchTree类,我要在其中完成搜索和插入方法。搜索应该返回对应于所搜索键的节点的值。 这里是树类,这里是节点类。我的搜索和插入方法如下。 看来我已经接近了,但是将键0和值2插入树[node[0,1,null,null]]的测试结果是树[node[0,1,null,null]]而不是正确的树[node[0,2,null,

  • 我正在学习C++语言,我正在尝试编写BST,但是出了问题。我尝试添加元素到空树,根是NULL,但添加元素后,根仍然是NULL,尽管添加成功了(我在调试模式下看到,节点设置为tmp)。我不知道为什么会这样。

  • 到目前为止我的理解是: > (i)调用值=10的。由于root已经设置为50,如果条件为10<50,程序将进入第二个。 (ii)调用Root.left为10,节点值为2的递归insert函数。程序再次进入第二个if条件,条件为2<10。 (iii)再次调用Root.left为None,value为2的递归insert函数。现在程序进入first if条件,root获得值2。这将完成递归重复调用,程