Java — путь определенного значения в бинарном дереве (2)

ссылка на тему

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

возвращаемое значение:
[]

идеи решения проблем

Этот вопрос необходимо решить с помощью глубокого поиска и поиска с возвратом, который разделен на следующие шаги.

  1. Добавьте значение узла
  2. Определить, выполняется ли условие, и если да, добавить текущий результат в набор результатов.
  3. продолжить глубокий поиск
  4. Судя по тому, находится ли он за пределами границ, если он находится за пределами границ, он вернется в предыдущее состояние.

Определите переменную результата 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);
    }
}

Supongo que te gusta

Origin blog.csdn.net/m0_60867520/article/details/130347649
Recomendado
Clasificación