Если исходное дерево не обязательно AVL-сбалансировано, вы не можете просто скопировать его.
Чтобы гарантировать, что в новом дереве нет перебалансировки, вы должны создать complete двоичное дерево, и вы должны вставить узлы в порядке BFS / уровень, чтобы каждое промежуточное дерево также было завершено.
"Полное" дерево - это дерево, в котором каждый уровень заполнен, за исключением, возможно, последнего. Поскольку каждое полное дерево сбалансировано по AVL, а каждое промежуточное дерево завершено, повторная балансировка не требуется.
Если вы не можете скопировать исходное дерево в массив или другую структуру данных, то вы ' Вам нужно будет выполнить log (N) в порядке обхода исходного дерева, чтобы скопировать все узлы. Во время первого обхода вы выбираете и копируете root. Во время второго вы выбираете и копируете уровень 2. Во время третьего вы копируете уровень 3 и т. Д. c.
Выбор исходного узла для каждого уровня зависит только от его индекса в источнике. дерево, поэтому фактическая структура исходного дерева не имеет значения.
Поскольку каждый обход занимает O (N) времени, общее время, потраченное на обход, составляет O (N log N). Однако, поскольку вставки занимают O (log N) времени, это то же самое, что и вставка, поэтому обходы журнала N не увеличивают сложность всего процесса.