通过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
在给定这个特定示例的情况下,如何移动我的二叉树对象,以及我现在所做的工作,特别是当树扩展时,我感到困惑。想法或建议?
答案 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