Есть хорошее рекурсивное понимание, которое вы можете использовать для решения этой проблемы.Я позволю вам проработать детали того, как на самом деле реализовать это в коде, поскольку я не знаю, как у вас представлено дерево, но вот основная идея.
Во-первых, действительно легко преобразовать пустое дерево в формат LC / RS: оно возвращается как пустое дерево.
С другой стороны, предположим, что у вас есть непустое дерево.Начните с преобразования каждого из его дочерних элементов в формат LC / RS (рекурсивно).Например, учитывая это дерево:
A
/ | \
B C D
/ | \ |
E F G H
/ \
I J
Вы начнете с рекурсивного преобразования каждого дочернего элемента в LC / RS, возвращая эти три дерева:
B C D
/ /
E H
\
F
/ \
I G
\
J
Эти деревья в настоящее времясвободно плавающий и не связанный друг с другом.Но так как вы знаете, что они братья и сестры, вы захотите сделать C правильным потомком B, а D - правильным потомком C. По сути, это обход связанного списка.Вот как все должно выглядеть, когда вы закончите:
B
/ \
E C
\ \
F D
/ \ /
I G H
\
J
После того, как вы это сделаете, все, что осталось сделать, это сделать B левым потомком A, как показано здесь:
A
/
B
/ \
E C
\ \
F D
/ \ /
I G H
\
J
Напомним, что логика выглядит следующим образом:
- Если дерево для преобразования пусто, вернуть пустое дерево.
- В противном случае:
- Рекурсивно преобразуйте каждого из дочерних элементов корневого узла в формат LC / RS.
- Итерируйте по этим деревьям, назначая правые дочерние ссылки для связывания деревьев вместе.
- Назначьте указатель левого дочернего элемента A на точкук результирующему дереву (или к нулю, если у него нет дочерних элементов).
Я оставлю вам детали C ++ для заполнения. Если вы попыталисьЧтобы решить эту проблему и столкнуться с трудностями, не стесняйтесь задавать дополнительный вопрос с подробным описанием кода, который вы написали до сих пор, а также с конкретным неудачным тестом или конкретными ошибками компилятора, с которыми вы сталкиваетесь.Удачи!