CTCI 4.3:给定二叉树,设计一种算法,该算法创建每个深度的所有节点的链表

时间:2016-12-31 20:09:41

标签: ruby algorithm data-structures linked-list graph-algorithm

我用Ruby解决了这个问题,并且我使用了修改后的DFS算法来完成它。这个想法是,每当DFS必须查看相邻节点时,它就会查看子节点,因此它是一个新的级别,在下面的哈希中记录下来。

此实施/思考过程是否正确?那么,在没有为输入创建不同的二叉树的情况下,检查自己的实现是一种有效的方法吗?

#Given a binary tree, design an algorithm which creates a linked list of all the nodes at each depth.
#(e.g if you have a tree with depth D, you'll have D linked lists).

#Space: O(N)
#Time: O(N)
def linked_list_hash(head)
  level_hash = {}
  level_hash[1] = LinkedList.new(head)
  dfs(head, level_hash)
  level_hash
end

def dfs(node, level_hash)
  new_level = level_hash.keys.last+1
  level_hash[new_level] = LinkedList.new 
  adj(node).each do |child|
    level_hash[new_level].insert(child)
    dfs(child, level_hash)
  end
end

private 
def adj(node)
  [node.left, node.right]
end

1 个答案:

答案 0 :(得分:0)

一个问题:dfs每次调用时都会创建一个新level_hash[new_level]。但是每个节点都会调用一次,因此每次找到新节​​点时,最终都会覆盖列表。不确定是否还有其他问题,但是那个问题已经跳出来了。

你的思维过程似乎没问题。我会考虑为这样的问题做一个BFS而不是DFS,因为你试图按深度分组。但是,基于DFS的方法确实有效。

要检查你的代码,你可以从推理它开始,然后用它来避免它,这会产生很多错误。否则,用实际输入测试代码就没有任何替代品。我被要求在面试中做到这一点。测试时,您希望确保获得良好的代码覆盖率;尝试沿着所有不同的代码路径前进。并尝试找到要测试的特殊情况(在这种情况下,如果你传入一个空树?或者一个根没有孩子的那个?)