A recursão é um algoritmo (ou técnica de programação) amplamente utilizado. A recursão é usada na implementação de codificação de muitas estruturas de dados e algoritmos, como busca em profundidade DFS, travessia de árvore binária de ordem intermediária frontal e assim por diante.
Problemas recursivos precisam ter características:
- 145. Percurso pós-ordem de uma árvore binária - LeetCode Um problema pode ser decomposto em soluções para vários subproblemas
- A escala do problema e subproblema é diferente, e o pensamento de resolver o problema é exatamente o mesmo
- Existe uma condição de terminação recursiva
Por exemplo: Agora você está assistindo a um filme no cinema e quer saber em qual linha você está, então você pode perguntar à pessoa da linha anterior em qual linha está, e adicionar 1 à dele é a resposta, então o sub -a pergunta neste exemplo é a linha A anterior é a primeira linha, e a condição de término é que, quando a primeira linha for alcançada, as pessoas na primeira linha saberão naturalmente que estão na primeira linha.
O processo de ir é à mão
o processo de voltar
O problema recursivo tem principalmente que encontrar a fórmula recursiva:
No exemplo anterior:
O número de linhas em que você está = o número de pessoas na linha anterior + 1
É a fórmula recursiva.
Problema Clássico de Recursão: Sequência de Fibonacci
Fórmula de recursão: f(n)=f(n-1)+f(n-2)
Condição de rescisão: f(1)=1 f(2)=1
Etapas para resolver um problema recursivo:
- Decomponha o subproblema e encontre a fórmula de recorrência
- Descubra a condição de rescisão
Escrevendo código específico:
-
Parâmetros de função de função recursiva e valor de retorno (o parâmetro da função recursiva são os dados a serem processados e o valor de retorno é julgado de acordo com a situação específica)
-
A condição de término da função recursiva (parâmetros recursivos ou algo como um contador, preste atenção ao valor retornado)
94. Traversal inorder da árvore binária - LeetCode
Traversal inorder de uma árvore binária
A travessia em ordem é esquerda, meio e direita. Primeiro, o nó no topo da árvore binária é visitado e, em seguida, é visitado camada por camada até atingir a parte inferior do lado esquerdo da árvore e, em seguida, começa para processar o nó.
Para esta questão precisamos retornar a sequência do percurso inorder da árvore binária:
Portanto, a configuração do parâmetro é: nó da árvore, uma matriz que armazena os valores dos nós
código mostra como abaixo:
struct TreeNode{
TreeNode* left;
TreeNode* right;
int val;
//构造函数
TreeNode():val(0),left(nullptr),right(nullptr){};
TreeNode(int v):val(v),left(nullptr),right(nullptr){};
TreeNode(int v,TreeNode* l,TreeNode* r):val(v),left(l),right(r){};
}
class Solution {
public:
vector<TreeNode*> vec;
vector<int> inorderTraversal(TreeNode* root) {
//存储结果的数组
vector<int> res;
inorder(root,res);
return res;
}
//递归函数
void inorder(TreeNode* root,vector<int>& res){
if(!root){
return;
}
else{
inorder(root->left,res);
res.push_back(root->val);
inorder(root->right,res);
}
}
};
A versão recursiva da travessia de pré-ordem e pós-ordem da árvore binária é semelhante ao código acima
Link do tópico:
144. Traversal de pré-encomenda da árvore binária - LeetCode