Поскольку у вас уже есть внешняя структура дерева (очередь), я предполагаю, что вы не против использовать немного дополнительной памяти, чтобы выполнить работу быстрее.
Сделайте это в два концептуальных шага с хеш-таблицей:
- Сначала создайте хеш-таблицу, которая связывает идентификаторы узла с их фактическим узлом.
- Затем найдите родительский узел на основе родительского узлаИдентификатор в хэш-таблице и добавление дочернего элемента к этому родителю.
Более программно:
for each node
add node to hash table indexed by node's parent
for each node
if parent is null set node as the root
otherwise look up in the hash table the parent from the parent ID of the node
add the node as a child of the found parent
Единственная потенциальная проблема, связанная с этим приемом, заключается в том, что вы не обязательно получитедействительное дерево до самого конца.(То есть корневой узел может не иметь дочернего элемента до последней ссылки.) В зависимости от того, что вы делаете со своим деревом, это может быть проблемой.
Если это проблема, вы можете в итогевыполнить ту же операцию со структурой данных, у которой нет этой проблемы (просто ванильное дерево без прикрепленных данных), а затем отразить структуру.
В целом, это должно быть в среднем O(N)
.