Во-первых, я предполагаю, что ваш level order traversal
в основном является BFS.
Теперь давайте посмотрим на строку. Выполняя BFS, мы печатаем «1», если текущий узел имеет двух сыновей. В противном случае это лист, и мы печатаем 0, завершая обработку текущей ветви.
Следовательно, во время обратной задачи мы можем вспомнить список последних узлов открытых ветвей и добавить туда входящие узлы.
Продемонстрируем этот подход на примере:
Level 1:
Tree :
1 - id 0
Open branches : 0 0 (left and right son)
Remaining string : 11001000
*********
Level 2:
Tree :
1
1 1
Open branches : 1 1 2 2
Remaining string : 001000
*********
Level 3:
Tree :
1
1 1
0 0 1 0
Open branches : 5 5
Remaining string : 00
Level 4:
Tree :
1
1 1
0 0 1 0
0 0
No more input, we're done.
Имея дерево, обход после того, тривиальна.
И код (предполагается, что дерево довольно плотное, в противном случае это не очень эффективные памяти):
import java.util.ArrayDeque;
import java.util.Queue;
public class Main {
static final int MAX_CONST = 50;
public static void main(String[] args) {
String evilString = "111001000"; // Assuming this string is a correct input
char[] treeRepr = new char[MAX_CONST];
Queue<Integer> q = new ArrayDeque<Integer>();
q.add(0);
for (int i = 0; i < evilString.length(); ++i) {
int index = q.remove();
char ch = evilString.charAt(i);
if (ch == '1') {
q.add(2*(index+1)-1);
q.add(2*(index+1));
}
treeRepr[index] = ch;
// System.out.println(q.size());
}
System.out.println(arrToString(treeRepr, 0, new StringBuilder()));
}
public static StringBuilder arrToString(char[] array, int index, StringBuilder sb) {
if (array[index] == '1')
{
arrToString(array, 2*(index+1)-1, sb);
arrToString(array, 2*(index+1), sb);
}
sb.append(array[index]);
return sb;
}
}
Нелистовой узел, который имеет всего 1 ребенка - какое значение это имеет? –
Нет узлов, которые имеют всего 1 ребенка. У него либо есть два, либо нет детей. – user3129550