Я решаю эту проблему с Ruby, и для этого я использовал модифицированный алгоритм DFS. Идея состоит в том, что каждый раз, когда DFS должна смотреть на соседние узлы, он смотрит на детей, и поэтому это новый уровень, записанный как таковой в хэше ниже.CTCI 4.3: Учитывая двоичное дерево, создайте алгоритм, который создает связанный список всех узлов на каждой глубине.
Правильно ли это реализация/мыслительный процесс? И на этой ноте, что является эффективным способом для меня проверить мою собственную реализацию, не создавая разные двоичные деревья для ввода?
#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