【发布时间】:2021-10-04 09:13:18
【问题描述】:
我正在研究数据结构,但遇到了一个挑战。目标是根据数组元素的值将数组元素插入二叉搜索树,即(主树的root_node为array[0],左子树的root_node小于父节点,右子树的root_node大于父节点父节点)。这是递归完成的,直到所有数组元素都插入到 BST 中。
我已经实现了两个类:
- 表示具有属性(数据、左、右)的节点:
class Node
attr_reader :data
attr_accessor :left, :right
def initialize(data)
@data = data
end
end
- 表示根值设置为 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 的私有方法,它执行将节点插入树的实际工作。我将它与insert分开,因为需要使用 RSpec 评估的预期解决方案。 - 然后我进行了
pre_order遍历,将每个节点打印到终端窗口。
- 我有一个
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
得到:
【问题讨论】:
标签: ruby algorithm data-structures binary-search-tree insertion