在数组中保存searchtree的值,而不使用全局变量

时间:2017-05-14 08:55:12

标签: ruby recursion global-variables binary-search-tree

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

$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=>{}}}}}}

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

提前感谢所有答案。

2 个答案:

答案 0 :(得分:1)

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

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默认为空数组。

答案 1 :(得分:0)

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

@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

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