首先,我假設你的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