Сложность: hard
Мы запускаем предварительный поиск в глубину (DFS) на корне двоичного дерева. На каждый узел в этом обходе мы выводим D тире (где D - глубина этого узла), а затем выводим значение этого узла.Если глубина узла равна D, то глубина его ближайшего потомка равна D + 1.Глубина корневого узла равна 0. Если у узла есть только один ребенок, то этот ребенок гарантированно является левым ребенком. Учитывая выходной обход этого обхода, восстановите дерево и верните его корень.
Пример:
Input: traversal = "1-2--3--4-5--6--7"
Output: [1,2,5,3,4,6,7]
👨💻 Алгоритм:
1⃣Разбор строки:
Пройдите по строке, чтобы определить уровни узлов и их значения. Используйте два счетчика: один для отслеживания текущего уровня (количество тире), второй для значения узла.
2⃣Создание узлов:
Создайте новые узлы на основе уровня и значения из строки. Для каждого нового узла найдите его родительский узел из стека и добавьте узел как левого или правого ребенка.
3⃣Построение дерева:
Используйте стек для отслеживания текущих узлов на каждом уровне глубины. Когда узел создан, добавьте его в стек. Если узел завершен, уберите его из стека.
😎 Решение:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
public TreeNode recoverFromPreorder(String S) {
Stack<TreeNode> stack = new Stack<>();
for (int i = 0; i < S.length();) {
int level = 0;
while (i < S.length() && S.charAt(i) == '-') {
level++;
i++;
}
int value = 0;
while (i < S.length() && Character.isDigit(S.charAt(i))) {
value = value * 10 + (S.charAt(i) - '0');
i++;
}
TreeNode node = new TreeNode(value);
if (level == stack.size()) {
if (!stack.isEmpty()) {
stack.peek().left = node;
}
} else {
while (level != stack.size()) {
stack.pop();
}
stack.peek().right = node;
}
stack.push(node);
}
while (stack.size() > 1) {
stack.pop();
}
return stack.peek();
}
}Ставь 👍 и забирай 📚 Базу знаний