了解红宝石数据处理

问题描述

我试图实现一个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上找到它

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...