使用 Ruby 打印广度优先搜索
Printing out Breadth First Search using Ruby
通过 Web 探索各种示例,我似乎无法使用广度优先示例实现打印我的二叉树。我在 #printf(children=nil)
中得到了 children=nil
的提示,但无法进行任何操作。我提供了创建队列 array 或两个的想法,但我的特定功能不执行搜索或传递任何参数。我只是想从顶部节点向下打印我的树。
二叉树的输出
=> #<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
对于如何在给出这个特定示例的二叉树对象中移动以及我现在所拥有的东西不起作用感到困惑,尤其是当树扩展时。想法或建议?
Tree中层序遍历的灵感来自于Graph的BFS,层序中我们使用queue来遍历树,不断推左右节点,直到队列为空或找到节点(如果我们寻找一个)。这是相同的典型示例:
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
假设 root
是 BST class 中的一个 getter 方法。 Class Queue
在 Ruby 中可用线程。您可能必须在代码中执行 require 'thread'
才能在代码中使用它。
时间复杂度:O(n)
Space 复杂度:队列的 O(n)。
从上面修改
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
通过 Web 探索各种示例,我似乎无法使用广度优先示例实现打印我的二叉树。我在 #printf(children=nil)
中得到了 children=nil
的提示,但无法进行任何操作。我提供了创建队列 array 或两个的想法,但我的特定功能不执行搜索或传递任何参数。我只是想从顶部节点向下打印我的树。
二叉树的输出
=> #<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
对于如何在给出这个特定示例的二叉树对象中移动以及我现在所拥有的东西不起作用感到困惑,尤其是当树扩展时。想法或建议?
Tree中层序遍历的灵感来自于Graph的BFS,层序中我们使用queue来遍历树,不断推左右节点,直到队列为空或找到节点(如果我们寻找一个)。这是相同的典型示例:
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
假设 root
是 BST class 中的一个 getter 方法。 Class Queue
在 Ruby 中可用线程。您可能必须在代码中执行 require 'thread'
才能在代码中使用它。
时间复杂度:O(n)
Space 复杂度:队列的 O(n)。
从上面修改
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