У меня есть предварительный обход бинарного дерева, которое хранится в массиве, и я хотел бы воссоздать двоичное дерево на основе этого обхода. Мой массив выглядит следующим образом: {NNNLLNLLNLNLNNLLNLL}, где N представляет узел, а L - лист. Я бы хотел сделать это рекурсивно, но у меня возникли проблемы с алгоритмом. Любые предложения будут очень оценены.Построение двоичного дерева из заданного обхода предварительного порядка
ответ
Перед восстановлением дерева вам потребуется еще один обход. При любых двух проходах между тремя (Pre, Post, In) вы можете восстановить. Но, учитывая только одно, невозможно однозначно восстановить дерево.
Вы правы, если это не строгое двоичное дерево, в этом случае можно восстановить (уникальное) дерево с помощью алгоритма, который я предоставил. – LeartS
Абсолютно. + 1'd ваш ответ :) –
Это должно работать при условии, каждый узел имеет 2 или 0 потомков (дерево, которое удовлетворяет это свойство называется полный или строгое бинарное дерево)
void create_from_traversal(Node* root, int& index) {
if (traversal[index] == 'L') {
root->left = root->right = NULL;
return;
}
root->left = new Node();
create_from_traversal(root->left, ++index);
root->right = new Node();
create_from_traversal(root->right, ++index);
}
Полный пример с проверкой:
#include <string>
#include <iostream>
class Node {
public:
Node* left;
Node* right;
};
std::string traversal = "NNNLLNLLNLNLNNLLNLL";
void create_from_traversal(Node* root, int& index) {
if (traversal[index] == 'L') {
root->left = root->right = NULL;
return;
}
root->left = new Node();
create_from_traversal(root->left, ++index);
root->right = new Node();
create_from_traversal(root->right, ++index);
}
void print_traversal(Node* root) {
if (root->left == NULL) {
std::cout << "L";
return;
}
std::cout << "N";
print_traversal(root->left);
print_traversal(root->right);
}
int main() {
Node* root = new Node();
int index = 0;
create_from_traversal(root, index);
// Does it work?
print_traversal(root); // Output should be equal to given traversal
std::cout << std::endl;
}
Выход:
NNNLLNLLNLNLNNLLNLL
Этот код передает пример, который я дал ниже правильного взвешенного дерева, 'NLNNNLLLL'. –
- 1. Максимальная ширина двоичного дерева с использованием обхода предварительного порядка
- 2. Построение BST из заданного обхода почтового отправления
- 3. Построение двоичного дерева, заданного Почтовый заказ
- 4. Построение двоичного дерева предзаказа, порядка и порядка в порядке
- 5. Выйти из двоичного предварительного обхода порядка до завершения
- 6. Построение двоичного дерева из заданных ошибок порядка и предварительных порядков
- 7. Обход порядка двоичного дерева
- 8. Предпросмотр обхода двоичного дерева
- 9. Для обхода двоичного дерева
- 10. Построение дерева Хаффмана из дерева двоичного поиска
- 11. Временная сложность построения двоичного дерева от обхода порядка и предзаказов
- 12. Что такое временная сложность рекурсивного обхода порядка двоичного дерева
- 13. Двоичное дерево поиска итеративного обхода предварительного порядка без дополнительного хранилища
- 14. Построение двоичного дерева
- 15. Эффективность времени обхода двоичного дерева
- 16. Построение двоичного дерева из уровня порядка и обход дерева по порядку
- 17. Обход обхода двоичного дерева поиска
- 18. Создание двоичного дерева из ввода порядка уровня
- 19. Сложность Построение двоичного дерева из массива
- 20. Построение двоичного дерева Ruby из строки
- 21. Построение двоичного дерева из списка (preorder)
- 22. Построение двоичного дерева в lisp
- 23. Построение двоичного дерева в Java
- 24. Сложность времени прохождения порядка двоичного дерева
- 25. Тестирование обхода двоичного дерева поиска (BST)
- 26. Обобщение действий для обхода двоичного дерева?
- 27. Построить полное двоичное дерево из списка обхода предварительного порядка Python
- 28. Ширина первого обхода двоичного дерева в Java?
- 29. Интуитивное объяснение обхода двоичного дерева без рекурсии
- 30. Удалить дубликаты из двоичного дерева
Необязательный вопрос: Зачем вам это нужно хранить в двоичном дереве в определенном порядке? Каковы данные? –
Это для дерева кодирования huffman. – Kalmar