[英]Binary Search Tree Insertion method in Ruby
我正在研究数据结构,但遇到了其中一项挑战。 目标是将数组元素根据其值插入二叉搜索树,即(主树的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
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 打印到终端窗口。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
方法的末尾调用它。
哦,我终于找到了解决挑战的方法。 我只是要演示我是如何做的以供将来参考:
因此,我没有使用两个单独的方法insert
和insert_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_order
、 inorder
等中打印树节点
我希望这对其他人有用。 快乐编码!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.