árbol binario? Y el camino!
Título
Dado un árbol binario y un objetivo y encontrar todos los caminos desde el nodo raíz hasta el nodo hoja es igual a la suma de la ruta y el destino dado.
Descripción: nodo hoja es un nodo no tiene nodos secundarios.
Ejemplos
Ejemplo:
Dado el siguiente árbol binario, y el objetivo y la suma = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
Devuelve:
[
[5,4,11,2],
[5,8,4,5]
]
tema de análisis
- Objetivo: encontrar todas las rutas a partir de la raíz al nodo hoja ⇒ su unión es igual al valor objetivo
- Encontrar el camino de la raíz a nodo hoja ⇒ solución recursiva
- Si el nodo es igual a la suma del valor objetivo ruta ⇒ Agregar
Ideas de resolución de problemas
variable | efecto |
---|---|
encontrar() | La búsqueda de la función de trayectoria |
proceso
- ⇒ Añadir nodo actual para actualizar la ruta del nodo y
- Analizando el nodo es igual a la suma del valor de destino y el nodo actual es un nodo hoja si la condición se cumple ⇒ agregar la ruta a la respuesta
- Si el subárbol izquierdo no está vacía ⇒ actualización de la izquierda nodo hijo al nodo actual, repita 2,3,4
- Si el subárbol derecho no está vacía ⇒ de actualización adecuados nodos hijos del nodo actual, repita el 2,3,4
Código es el siguiente
void find(TreeNode*root, int add, int sum, vector<int> path, vector<vector<int>> &ans)
{
add += root->val; //更新结点和
path.push_back(root->val); //当前结点加入路径
if(add == sum&&!root->left&&!root->right) ans.push_back(path);
if(root->left) find(root->left,add,sum,path,ans);
if(root->right) find(root->right,add,sum,path,ans);
}
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
if(!root) return{};
vector<vector<int>> ans;
vector<int> path;
int add =0;
find(root, add, sum, path, ans);
return ans;
}
};