我用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
答案 0 :(得分:0)
一个问题:dfs
每次调用时都会创建一个新level_hash[new_level]
。但是每个节点都会调用一次,因此每次找到新节点时,最终都会覆盖列表。不确定是否还有其他问题,但是那个问题已经跳出来了。
你的思维过程似乎没问题。我会考虑为这样的问题做一个BFS而不是DFS,因为你试图按深度分组。但是,基于DFS的方法确实有效。
要检查你的代码,你可以从推理它开始,然后用它来避免它,这会产生很多错误。否则,用实际输入测试代码就没有任何替代品。我被要求在面试中做到这一点。测试时,您希望确保获得良好的代码覆盖率;尝试沿着所有不同的代码路径前进。并尝试找到要测试的特殊情况(在这种情况下,如果你传入一个空树?或者一个根没有孩子的那个?)