Структура просто совершенно не подходит для перестановок, но, поскольку вы знаете, что она расположена по центру, вы можете сделать некоторые предположения, которые помогут вам.
Я пытался работать так же, как у вас, и меня всегда ловил тот факт, что у вас есть только двоичный фрагмент информации (поменялся или нет), которого недостаточно. На четыре листа у вас есть 4! (24) возможных комбинаций, но у вас есть только три ветви (3 бита, 8 возможных комбинаций) для хранения информации о состоянии перестановки. У вас просто нет места для хранения этой информации.
Но, возможно, вы могли бы написать traverser, который проходит по дереву и использует количество листьев, чтобы определить, сколько свопов необходимо, а затем систематически проходит эти свопы, вместо того, чтобы просто оставить его самому дереву.
Что-то вроде
For each permutation
Encode the permutation as a series of swaps from the original
Run these swaps on the original tree
Do whatever processing is needed on the swapped tree
Это может не подходить для вашего приложения, но вы не предоставили так много подробностей о том, почему вы должны делать это так, как вы это делаете. То, как вы делаете это сейчас, просто не сработает, так как факториал (число перестановок) растет быстрее, чем экспоненциальный (количество «поменяемых» битов, которые у вас есть). Если бы у вас было 8 листов, у вас было бы 7 веток и 8 листов в общей сложности 15 битов. Есть 40320 перестановок из 8 листов и только 32768 возможных комбинаций из 15 битов. Математически вы просто не можете представить перестановки.