ссылка на тему
Niuke.com онлайн вопрос - путь с определенным значением в бинарном дереве (2)
описание темы
Введите корневой узел root бинарного дерева и целое число expectNumber и найдите все пути, сумма значений узлов которых в бинарном дереве равна expectNumber.
1. Путь этого вопроса определяется как узел от корневого узла дерева до конечного узла
2. Листовой узел относится к узлу без дочерних узлов
3. Путь может идти только от родительского узла к дочерний узел, а не От дочернего узла к родительскому узлу
4. Общее количество узлов равно n
Если корень бинарного дерева равен {10,5,12,4,7}, а expectNumber равен 22
, допустимый путь — [[10,5,7],[10,12]]
Диапазон данных:
общее количество узлов в дереве находится в диапазоне [0, 5000]
-1000 <= значение узла <= 1000
-1000 <= expectNumber <= 1000
Пример темы
Пример 1
Ввод:
{10,5,12,4,7},22
Возвращаемое значение:
[[10,5,7],[10,12]]
Объяснение:
возвращение [[10,12],[10,5,7]] также верно
Пример 2
Ввод:
{10,5,12,4,7},15
возвращаемое значение:
[]
Пример 3
Ввод:
{2,3},0
возвращаемое значение:
[]
Пример 4
Ввод:
{1,3,4},7
возвращаемое значение:
[]
идеи решения проблем
Этот вопрос необходимо решить с помощью глубокого поиска и поиска с возвратом, который разделен на следующие шаги.
- Добавьте значение узла
- Определить, выполняется ли условие, и если да, добавить текущий результат в набор результатов.
- продолжить глубокий поиск
- Судя по тому, находится ли он за пределами границ, если он находится за пределами границ, он вернется в предыдущее состояние.
Определите переменную результата ArrayList<ArrayList<Integer>> для хранения конечного результата
Определите переменную списка ArrayList<Integer> для хранения коллекции процесса во время одного обхода
Реализовать алгоритм поиска в глубину FindPathDFS(TreeNode root, int expectNumber, ArrayList<ArrayList<Integer>> result, ArrayList<Integer> list), параметры: текущий рекурсивный узел, текущая ожидаемая сумма чисел, результат набора результатов, список наборов процессов , нет возвращаемого значения
Сначала оцените, пуст ли корень, если он пуст, вернитесь напрямую,
а затем добавьте текущий root.val в набор процессов
для обновления целевого значения, expectNumber -= root.val;
Если текущий корень не имеет левого поддерева и правого поддерева (в настоящее время конечный узел) и expectNumber == 0 (сумма всех чисел текущей ветви — expectNumber), добавить список в результат
Вызывать функцию рекурсивно, передавая левое и правое поддеревья
Наконец, если текущий список не соответствует условиям, он сразу возвращается в предыдущее состояние: список удаляет последний элемент, list.remove(list.size() - 1);
полный код
import java.util.ArrayList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int expectNumber) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if(root == null){
return result;
}
FindPathDFS(root, expectNumber, result, new ArrayList<>());
return result;
}
private void FindPathDFS(TreeNode root, int expectNumber, ArrayList<ArrayList<Integer>> result, ArrayList<Integer> list) {
if(root == null){
return;
}
list.add(root.val);
expectNumber -= root.val;
if(root.left == null && root.right == null && expectNumber == 0){
result.add(new ArrayList<>(list));
}
FindPathDFS(root.left, expectNumber, result, list);
FindPathDFS(root.right, expectNumber, result, list);
list.remove(list.size() - 1);
}
}