【问题标题】:Ruby Binary Search Tree insert method stack level too deepRuby Binary Search Tree 插入方法堆栈级别太深
【发布时间】:2021-07-16 09:23:02
【问题描述】:

我正在尝试为二叉搜索树编写递归插入方法,但不断收到 stack level too deep 是怎么回事,它一直给我错误?

我的节点类

class Node
  attr_accessor :value, :left, :right

  def initialize(value)
    @value = value
    left = nil
    right = nil
  end
end

二叉搜索树类

class Bst
  attr_accessor :root, :size

  def initialize
    @root = nil
    @size = 0
  end

  def insert(value, root=nil)
    if @root == nil
      @root = Node.new(value)
    end
    if value < @root.value
      if @root.left == nil
        @root.left = Node.new(value)
      else
        return insert(value, @root.left)
      end
      return root
    end
    if value > @root.value
      if @root.right == nil
        @root.right = Node.new(value)
      else
        return insert(value, @root.right)
      end
    end
    return root
  end

一旦我尝试将 4 添加到树中,就会发生这种情况

tree = Bst.new
tree.insert(10)
tree.insert(6)
tree.insert(19)
tree.insert(4)

【问题讨论】:

    标签: ruby binary-search-tree


    【解决方案1】:

    当您递归并提供新的root 时,您仍在将值与@root.value 进行比较。

    由于4 仍小于10,因此您递归并将@root.left 传递为root。但是,root 从未使用过;您再次比较@root.value,并与@root.left 递归,而这些永远不会改变;因此,你有无限的递归(或者至少在你爆栈之前是无限的)。

    您想与root.value 进行比较,并改为与root.left 进行递归。

    @rootroot 是不同的东西会让人困惑,并导致逻辑错误。更好的变量命名可能会防止此错误。

    编辑:

    class Node
      attr_accessor :value, :left, :right
    
      def initialize(value)
        @value = value
        @left = nil
        @right = nil
      end
    end
    
    class Bst
      attr_accessor :root, :size
    
      def initialize
        @root = nil
        @size = 0
      end
    
      def insert(value, node=nil)
        unless @root
          @root = Node.new(value)
          return
        end
    
        node ||= @root
    
        if value < node.value
          if node.left
            return insert(value, node.left)
          else
            node.left = Node.new(value)
          end
        elsif value > node.value
          if node.right
            return insert(value, node.right)
          else
            node.right = Node.new(value)
          end
        end
        @size += 1
        return node
      end
    end
    
    tree = Bst.new
    tree.insert(10)
    tree.insert(6)
    tree.insert(19)
    tree.insert(4)
    
    p tree
    

    【讨论】:

    • 我明白你在说什么,我正在尝试在我的代码中修复它。我现在将 root 重命名为 node 并在争论中有 node=nilnode = @root if @root == nil 但仍然使堆栈级别太深。你能在代码中显示如何修复吗?
    猜你喜欢
    • 2013-10-05
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2013-10-05
    • 2011-11-17
    相关资源
    最近更新 更多