将搜索树的值保存在数组中,而不使用全局变量



我正在尝试将搜索树中的值保存在数组中,但是如果没有全局变量,我就无法做到这一点。如果可能的话,我想保留递归。

$array = []
def to_array(s)
  if s != {}
  $array << s[:value]
  to_array(s[:left])
  to_array(s[:right])
  end
end

搜索树如下所示:

st1 = {:key=>2, :value=>0,
   :left=>{},
   :right=>{:key=>17, :value=>1,
            :left=>{:key=>13, :value=>2,
                    :left=>{:key=>10, :value=>4,
                            :left=>{},
                            :right=>{:key=>11, :value=>5,
                                     :left=>{},
                                     :right=>{}}},
                    :right=>{:key=>14, :value=>6,
                             :left=>{},
                             :right=>{}}},
            :right=>{:key=>22, :value=>3,
                     :left=>{},
                     :right=>{:key=>48, :value=>7,
                              :left=>{:key=>42, :value=>8,
                                      :left=>{},
                                      :right=>{}},
                              :right=>{:key=>77, :value=>9,
                                      :left=>{},
                                      :right=>{}}}}}}

如何在不使用全局变量的情况下将值保存在数组中?

提前感谢您的所有答案。

您可以将变量传递给方法并返回它:

def to_array(tree, array = [])
  unless tree.empty?
    array << s[:value]
    to_array(s[:left], array)
    to_array(s[:right], array)
  end
  array
end

您可以在第一次递归中调用该方法,而无需先创建数组array因为默认有一个空数组。

正如另一个答案所建议的那样,默认参数是避免全局变量的好方法。您还可以使用实例变量:

@array = []
def to_array(s)
  if s != {}
    @array << s[:value]
    to_array(s[:left])
    to_array(s[:right])
  end
  @array
end

如果未定义类,则该类将是 main 对象下的变量。或者,您可以返回一个局部变量:

def to_array(s)
  array = []
  if s != {}
    array << s[:value] 
    array << to_array(s[:left]) if s[:left] != {}
    array << to_array(s[:right]) if s[:right] != {}
  end
  array.flatten
end

(这可能会收紧一点,以避免对空哈希进行如此多的检查。

相关内容

  • 没有找到相关文章

最新更新