Рассмотрим ниже дерева:
10
/ \
20 30
/\
40 50
/\
60 70
Теперь на основе BFS, если вы создаете массив узлов (массив используется для более быстрого доступа), это будет выглядеть так:
Массив узлов: 10 20 30 40 50 N N N N 60 70 N N N N
Индекс: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Обратите внимание, что индексирование основано на 1 для более простого расчета, и дочерние узлы листьев обозначаются как N для NULL.
Теперь, если вы заметите, что для узла с индексом i его левый потомок находится с индексом 2 * i, а его правый потомок с индексом 2 * i + 1. Это свойство правильное двоичное дерево.
Теперь, чтобы скопировать двоичное дерево не рекурсивно.
- Создать массив узлов из исходного дерева на основе BFS.
- Назначить ток = 1 (ток для индекса),
Делать ниже, пока текущий <= размер массива узлов </p>
а. создать новый узел (родитель)
б. Присвойте значение parent-> val из узла на текущий момент.
с. Замените оригинальный узел в текущем (индекс) новым узлом. // Этот шаг должен пройти через новые узлы.
* 1 035 * d. создайте новый узел, назначьте parent-> left и присвойте значение из Lindex = 2 * current.
е. Замените оригинальный узел в Lindex новым узлом.
е. создать новый узел, назначить parent-> right и присвоить значение из Rindex = 2 * current + 1.
е. Замените оригинальный узел в Rindex новым узлом.
е. Увеличение тока на 1.
Теперь приближаемся ко времени сложности,
Так как в массиве мы также учли NULL дочерних элементов внешних узлов, нам нужно вычислить общий размер массива.
Если число узлов в исходном дереве равно n, то по свойству двоичного дерева число внешних узлов двоичного дерева всегда на 1 больше, чем количество внутренних узлов,
a. Number of external nodes is (n + 1) /2.
b. Number of children of external nodes (count of all null nodes) is 2 * (n + 1)/2 = n + 1.
c. Thus the total size of array is number of nodes + number of null nodes = n + n + 1 = 2n + 1
Поскольку во всем алгоритме мы прошли через весь массив, временная сложность этого подхода составляет O (n).