árvore binária? E o caminho!
Título
Dada uma árvore binária e um alvo e encontrar todos os caminhos do nó de raiz para o nó folha é igual à soma do caminho eo destino dado.
Descrição: nó folha é um nó não tem nós filhos.
Exemplos
Exemplo:
Dada a seguinte árvore binária, e o alvo e soma = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
Returns:
[
[5,4,11,2],
[5,8,4,5]
]
análise tópico
- Objetivo: encontrar todos os caminhos a partir da raiz para o nó folha ⇒ sua junção é igual ao valor-alvo
- Encontrar o caminho da raiz para o nó folha ⇒ solução recursiva
- Se o nó é igual à soma do caminho valor de destino ⇒ Add
idéias de solução de problemas
variável | efeito |
---|---|
encontrar() | Procura a função caminho |
processo
- ⇒ Adicionar nó atual para atualizar o caminho do nó e
- Analisando o nó é igual à soma do valor alvo e o nó atual é um nó folha, se a condição for satisfeita ⇒ adicionar o caminho para a resposta
- Se a sub-árvore esquerda não está vazio ⇒ atualização deixou nó filho ao nó atual, repita 2,3,4
- Se a sub-árvore direita não está vazio ⇒ atualização nós filhos certas para o nó atual, repita 2,3,4
Código é a seguinte
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;
}
};