У меня был готов полный ответ, но @EricWang обошел меня с реализацией.Итак, вот дополнительный ответ, описывающий процесс более подробно.Пожалуйста, примите его в качестве ответа.
Я собираюсь использовать обход после заказа DEBFGCA
, так как полезно рассмотреть чуть больше узлов.
Поскольку деревоВ завершение, для любого данного узла мы знаем, что число дочерних элементов слева равно числу дочерних элементов справа.Следовательно, мы можем посмотреть на обход порядка 100 * и узнать, что он имеет структуру LLLRRRN
, где L
- обход левого поддерева в порядке, R
- обход порядка в порядке.правое поддерево, а N
- это сам узел.
В общем, мы знаем, что обход по левому поддереву после заказа - это символы от 0
до (tree.length - 1)/2 - 1
, а обход по порядку:правильное поддерево - символы от (tree.length -1)/2 - 1
до tree.length - 2
.Узел является последним символом, в tree.length - 1
.
Очевидно, чтобы изменить это на обход в порядке, нам просто нужно идентифицировать левое и правое поддеревья, изменить их на обход в порядке изатем верните LLLNRRR
.Мы можем использовать рекурсию для преобразования левого и правого поддеревьев в порядок.
Так, например, начните с DEBFGCA
.Мы знаем, что структура LLLRRRN
, поэтому левое поддерево DEB
, правое поддерево FGC
и узел A
.Мы хотим превратить DEB
в порядок ...
Процесс DEB
.Мы знаем, что левое поддерево D
, правое E
, узел B
.Оба поддерева имеют длину 1, так же как и листья.Дальнейшая рекурсия не требуется.Вернуть LNR
, что составляет DBE
.
Процесс FGC
.Как и раньше, верните FCG
.
Теперь мы знаем, что слева расположен порядок DBE
, а справа - FCG
.Возврат LLLNRRR
, что составляет DBEAFCG
.