Получив двоичное дерево (BT), преобразуйте его в список двусвязных списков (DLL) на месте. Левый и правый указатели в узлах должны использоваться как предыдущий и следующий указатели соответственно в преобразованной DLL. Порядок узлов в DLL должен совпадать с порядком следования данного двоичного дерева. Первый узел обхода Inorder (самый левый узел в BT) должен быть головным узлом DLL.
Следующие два различных решения были обсуждены для этой проблемы.
Преобразовать данное двоичное дерево в двусвязный список | Комплект 1
Преобразовать данное двоичное дерево в двусвязный список | Набор 2
В этом посте обсуждается третье решение, которое кажется самым простым из всех. Идея состоит в том, чтобы выполнить обход по порядку двоичного дерева. При выполнении обхода inorder отслеживайте ранее посещенный узел в переменной скажем prev . Для каждого посещенного узла сделайте его следующим из prev и previous этого узла как prev .
Спасибо rahul, wishall и всем остальным читателям за их полезные комментарии к вышеупомянутым двум постам.
Ниже приводится реализация этого решения.
|
Джава
|
C #
|
Выход:
25 12 30 10 36 15
Обратите внимание, что использование статических переменных, как указано выше, не рекомендуется (мы использовали статические для простоты). Представьте себе ситуацию, когда одна и та же функция вызывается для двух или более деревьев, при следующем вызове для другого дерева будет использоваться старое значение prev . Чтобы избежать таких проблем, мы можем использовать двойной указатель или ссылку на указатель.
Сложность времени: вышеупомянутая программа выполняет простой обход по порядку, поэтому сложность времени равна O (n), где n — количество узлов в данном двоичном дереве.
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме
Рекомендуемые посты:
- Преобразовать данное двоичное дерево в двусвязный список | Набор 4
- Преобразовать данное двоичное дерево в двусвязный список | Комплект 1
- Преобразовать данное двоичное дерево в двусвязный список | Набор 2
- Преобразовать данное двоичное дерево в круговой двусвязный список | Набор 2
- Преобразование двоичного дерева в двусвязный список по спирали
- Преобразование бинарного дерева в круговой список двойных ссылок
- Извлечь листья бинарного дерева в двусвязный список
- Преобразовать массив в круговой двусвязный список
- Создайте двусвязный список из троичного дерева
- Свести двоичное дерево в связанный список | Set-3
- Свести двоичное дерево в связанный список
- Свести двоичное дерево в связанный список | Set-2
- Создать отсортированный связанный список из заданного двоичного дерева
- Создайте полное двоичное дерево из представления связанного списка
- Разница между односвязным списком и двусвязным списком
0.00 (0%) 0 votes