Problema de Likou Solución 34: Un camino cuya suma es un cierto valor en un árbol binario. Método: método de retroceso (bucle + recursión), modificación en DFS (registro de ruta)

1. Descripción del título: Enlace
Introduzca un árbol binario y un entero, e imprima todas las rutas donde la suma de los valores de los nodos en el árbol binario es el entero de entrada. Comenzando desde el nodo raíz del árbol y bajando hasta los nodos pasados ​​por los nodos hoja, forma un camino.
Ejemplo: dado el siguiente árbol binario, y el objetivo y la suma = 22,

          5
         / \
        4   8
       /   / \
      11  13  4
     /  \    / \
    7    2  5   1
返回:
[
[5,4,11,2],
[5,8,4,5]
]

2. Ideas:
Problema de búsqueda de ruta de árbol binario / problema de búsqueda de ruta de matriz, Primero piense en DFS, pero necesita regresar cuando la ruta sea incorrecta, así que piense en el método de retroceso.

2.1. La clave del método retrospectivo:

  • Registre la ruta actual antes de que comience la función recursiva y elimine la ruta actual después de que finalice la función recursiva.
  • El modo básico del método de retroceso es bucle for + función recursiva, y el bucle for puede desarrollarse y convertirse en un recorrido de cada situación.
    El bucle for maneja varias situaciones posibles de los parámetros en la función recursiva actual;
    la función recursiva en el bucle for realiza la siguiente etapa de recursividad en la situación actual.

2.2, retroceso de pseudocódigo:
enlaces de pensamiento, autor: luo-jing-yu-yu

result = []
void backtrack(路径,选择列表){
    
    
    if 满足结束条件{
    
    
       result.add(路径)
       return ; 
	}
    for 选择 in 选择列表{
    
    
       做选择
       backtrack(路径,选择列表)
       撤销选择
	}
}

El núcleo es la recursividad en el bucle for, que "hace una selección" antes de la llamada recursiva y "cancela la selección" después de la llamada recursiva.
La parte de selección generalmente necesita registrar los elementos que se han visitado para evitar visitas repetidas, como agregar una matriz usada [] o una matriz visitada [].
Ejemplo: Pregunta 38 de la entrevista. Disposición de las cuerdas

3. Código C ++:

class Solution {
    
    
private:
    vector<vector<int>> ans;
public:
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
    
     // 主函数入口
        vector<int> tmp;
        if(root == NULL) return ans;
        findPath(tmp,root,sum);
        return ans;
    }
    void findPath(vector<int>& tmp,TreeNode* root, int currVal){
    
     //DFS
        if(root == NULL) return ;
        if(root->val == currVal && root->left == NULL && root->right == NULL){
    
     // 终止条件
            tmp.push_back(root->val);
            ans.push_back(tmp);
            tmp.pop_back(); 
            return;
        }

		//递归核心部分代码:
        tmp.push_back(root->val); // 记录当前路径
        // 以下两行相当于for循环的展开,(实际为前序遍历)
        findPath(tmp,root->left,currVal-root->val); //递归,当前递归函数结束返回时实现回溯
        findPath(tmp,root->right,currVal-root->val);
        // 遍历完了左右子树,需要将当前节点从子序列中移除掉,可以联想到回溯算法
        tmp.pop_back();  // 移除当前路径,回溯的关键
    }
};

Temas similares: 93. Recuperar dirección IP

para resumir

1. Cuando el método de retroceso necesita registrar la ruta, agregue la función pop () al final de la función dfs.
2. El modo básico del método de retroceso es bucle for + función recursiva El bucle for puede desplegarse y convertirse en un recorrido transversal de cada situación.

Supongo que te gusta

Origin blog.csdn.net/qq_33726635/article/details/106456655
Recomendado
Clasificación