我正在研究数据结构,我遇到了一个难题。目标是根据数组元素的值将数组元素插入到二叉搜索树中,即(主树的根节点为数组[0],左子树的根_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评估的预期解决方案。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
得到了:
return '' if node.nil?
这是递归pre_order
的停止条件,它是您从binary_search_tree
返回的。您似乎没有任何东西可以将您的树格式化为您想要的形状,"8 3 1 6 4 7 10 14 13"
。所以添加该逻辑并在binary_search_tree
方法的末尾调用它。
哦,我终于找到了一个绕过挑战的方法。我将演示我是如何做到的,以供将来参考:
因此,我决定去掉冗余代码并想出一种方法来解决这个挑战,而不是使用两个单独的方法插入
和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_order
、inorder
等中打印树节点。
我希望这对其他人有用。编码愉快!!
二叉搜索树(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。这将完成递归重复调用,程