使用Ruby打印出广度优先搜索

时间:2017-01-04 04:29:14

标签: ruby-on-rails ruby tree binary-tree breadth-first-search

通过Web探索各种示例,我似乎无法用广泛的第一个示例来实现打印我的二叉树。我在children=nil内给出了#printf(children=nil)的提示,但无法获得任何结果。我提供了创建队列数组或两个的想法,但我的特定功能是不执行搜索或传入任何参数。我只是想从顶部节点打印我的树。

二叉树的输出

=> #<BinarySearchTree:0x007fbe40b044c8 @root=#<Node:0x007fbe40b044f0 @title="The Matrix", @rating=87, @parent=nil, @left=#<Node:0x007fbe40b04478 @title="Pacific Rim", @rating=72, @parent=#<Node:0x007fbe40b044f0 ...>, @left=nil, @right=#<Node:0x007fbe40b04428 @title="Braveheart", @rating=78, @parent=#<Node:0x007fbe40b04478 ...>, @left=nil, @right=nil>>, @right=#<Node:0x007fbe40b042e8 @title="District 9", @rating=90, @parent=#<Node:0x007fbe40b044f0 ...>, @left=nil, @right=#<Node:0x007fbe40b04298 @title="The Shawshank Redemption", @rating=91, @parent=#<Node:0x007fbe40b042e8 ...>, @left=nil, @right=nil>>>>

功能的输出应该如下:

The Matrix: 87
Pacific Rim: 72
District 9: 90
Braveheart: 78
Shawshank: 91
...

我的打印功能

def printf(children=nil)
  current = @root
  queue = [current]

  if current.left && current.right
    queue << current.left << current.right
    puts queue.methods.sort
  elsif current.right
    queue << current.right
  end

  queue.each do |i|
    #print out my created array
  end
end

在给定这个特定示例的情况下,如何移动我的二叉树对象,以及我现在所做的工作,特别是当树扩展时,我感到困惑。想法或建议?

2 个答案:

答案 0 :(得分:1)

Tree中的级别顺序遍历受图表BFS的启发,按级别顺序我们使用队列遍历树并继续推动左右节点,直到队列为空或找到节点(如果我们正在搜索一)。这是一个典型的例子:

def bfs(node)
  return nil if node.nil? || root.nil? # nothing to do if there is no node or root to begin the search
  queue = Queue.new
  queue.enq(root)
  result = nil
  while !queue.empty?
    value = queue.deq
    if value.title == node.title && value.rating == node.rating
      result = value
      break
    end

    # keep moving the levels in tree by pushing left and right nodes of tree in queue
    queue.enq(value.left) if value.left
    queue.enq(value.right) if value.right
  end

  result # returns node found in BST else default value nil
end

假设{B}类中root是一个getter方法。使用线程在Ruby中可以使用类Queue。您可能必须在代码中执行require 'thread'才能在代码中使用它。

时间复杂度:O(n)

空间复杂度:队列为O(n)。

答案 1 :(得分:0)

从上面修改

  def printf(node)
    return nil if node.nil?
    queue = Queue.new
    queue.enq(node)
    result = nil
    while !queue.empty?
      value = queue.deq
      puts value.title if !value.title.nil?
      # keep moving the levels in tree by pushing left and right nodes of tree in queue
      queue.enq(value.left) if value.left
      queue.enq(value.right) if value.right
    end
  end