Ruby中二进制搜索树实现中的递归调用不会发生

Ruby中二进制搜索树实现中的递归调用不会发生,ruby,recursion,Ruby,Recursion,我已经用Ruby实现了BST。迭代方法工作得很好,但是,尝试为insert方法实现递归实现似乎不起作用。 出于某种原因,只有一个递归调用(即深度) 方法是这样的 def insert_rec(node, value) if node.nil? return Node.new(value, nil, nil) elsif value < node.value node.left ||= insert_rec(node.left, value)

我已经用Ruby实现了BST。迭代方法工作得很好,但是,尝试为
insert
方法实现递归实现似乎不起作用。 出于某种原因,只有一个递归调用(即深度)

方法是这样的

  def insert_rec(node, value)
    if node.nil?
      return Node.new(value, nil, nil)
    elsif value < node.value
      node.left ||= insert_rec(node.left, value)
    elsif value > node.value
      node.right ||= insert_rec(node.right, value)
    else
      # TODO return?
    end
  end 
def insert_rec(节点,值)
如果node.nil?
return Node.new(value,nil,nil)
elsif值node.value
node.right | |=插入_rec(node.right,值)
其他的
#要回去吗?
结束
结束
对于上面的代码,我可以调用
insert
For>3个数字,但是我总是有一个最大深度为2的树

谢谢:/
Ronen

如前所述,您没有保留创建超过前两个级别的节点的结果,因为Ruby会按值传递,并且不会返回更新的
节点
对象。如果从赋值中删除
|
,并从递归中返回当前
节点,则此操作有效:

def insert_rec(node, value)
  if node.nil?
    node = Node.new(value, nil, nil)
  elsif value < node.value
    node.left = insert_rec(node.left, value)
  elsif value > node.value
    node.right = insert_rec(node.right, value)
  end
  node
end
def insert_rec(节点,值)
如果node.nil?
node=node.new(值,nil,nil)
elsif值node.value
node.right=插入记录(node.right,值)
结束
节点
结束

如前所述,您没有保留创建超过前两个级别的节点的结果,因为Ruby会传递值,并且不会返回更新的
节点
对象。如果从赋值中删除
|
,并从递归中返回当前
节点,则此操作有效:

def insert_rec(node, value)
  if node.nil?
    node = Node.new(value, nil, nil)
  elsif value < node.value
    node.left = insert_rec(node.left, value)
  elsif value > node.value
    node.right = insert_rec(node.right, value)
  end
  node
end
def insert_rec(节点,值)
如果node.nil?
node=node.new(值,nil,nil)
elsif值node.value
node.right=插入记录(node.right,值)
结束
节点
结束

请显示您的类
节点
。感谢您的回复,
节点
只是一个结构
Node=Struct.new(:value,:left,:right)
any?:(bumpingRonen,我今晚再看一看。请给你的班级看一下
Node
。谢谢你的回答,
Node
只是一个结构;
Node=struct.new(:value,:left,:right)
有人吗?:(bumpingRonen,我今晚再看一看。