我试图实现一个ruby二进制搜索树,创建,添加和打印节点很好,当我实现#delete时问题就出现了
(我将在下面的代码中发布)此树的结构是嵌套的二进制节点(为什么?我对ruby指针一无所知)
class BinaryNode
attr_accessor :value
attr_accessor :left_node
attr_accessor :right_node
def initialize (value = nil, left_node = nil, right_node = nil)
@value = value
@left_node = left_node
@right_node = right_node
end
end
左右节点将是另一个二进制节点,并且继续进行
因此,当我想插入一个节点(很好)时,我使用一个临时二进制节点遍历该树,当我达到目标(如果未遇到重复项)时,我只是使该临时对象成为子节点(根据进行比较),但是为什么这样做有效,我的意思是我复制了二进制节点,并修改了COPIED节点,但是有效,
这是#insert,如果您需要更多的见识
def insert (value, node = @root)
if value == node.value
return nil
elsif value > node.value
if node.right_node == nil
node.right_node = BinaryNode.new(value)
else
insert value, node.right_node
end
else
if node.left_node == nil
node.left_node = BinaryTree.new(value)
else
insert value, node.left_node
end
end
end
现在,当我将相同的逻辑应用于删除节点(当前卡在叶子上,尚未探究和测试其他情况)时,它失败了,如果我的陈述不够充分,这是代码
def delete (value)
temp = @root
sup_node = temp
while temp.value != value
puts "currently at #{temp.value}"
if temp.value > value
temp = temp.left_node
puts "going left"
elsif temp.value < value
temp = temp.right_node
puts "going right"
end
target_node = temp
puts "target_node: #{target_node.value}"
end
if target_node.right_node == nil
puts "right node is nil"
if target_node.left_node == nil
puts "left node is nil"
puts "deleting node"
target_node = nil
else
temp_node = target_node.left_node
target_node.left_node = nil
target_node = temp_node
end
else
target_node_right = target_node.right_node
last_left_node = target_node_right
while last_left_node.left_node != nil
last_left_node = last_left_node.left_node
end
if last_left_node.right_node == nil
target_node.value = last_left_node.value
last_left_node = nil
else
last_left_parent_node = target_node_right
while last_left_parent_node.left_node != last_left_node
last_left_parent_node == last_left_parent_node.left_node
end
#some chaos going on here
last_left_parent_node.right_node = last_left_node.right
last_left_parent_node.left_node = nil
target_node.value = last_left_node.value
last_left_node = nil
end
end
end
我的主要问题是,为什么一种方法在一种情况下行之有效,但在另一种情况下会中断,以及ruby如何跟踪复制的数据并修改原始数据,我对它本身的二叉树算法不感兴趣(任何问题都可能很容易找到。 )
预先感谢
对不起,很长,如果您想要整个代码(尽管我认为复制的内容就足够了),可以在github上找到它