递归是一种应用非常广泛的算法(或者编程技巧)。很多数据结构和算法的编码实现都要用到递归,比如 DFS 深度优先搜索、前中后序二叉树遍历等等。
递归问题需要具备的特征:
- 145. 二叉树的后序遍历 - 力扣(LeetCode)一个问题可以分解为几个子问题的解
- 问题和子问题的规模不同,解题思路完全一致
- 存在递归终止条件
例如:现在你处于电影院看电影,你想知道自己是第几排,那么你可以问前一排的人是第几排,在他的基础上加1就是答案,那么本例子的子问题就是前一排是第几排,终止条件为到第一排时,第一排的人自然知道自己是第一排。
去的过程为递
回来的过程为归
递归问题主要得找出递归公式:
在上个例子中:
你在的排数=前一排人的排数+1
就是递推公式。
经典的递归问题:斐波那契数列
递推公式:f(n)=f(n-1)+f(n-2)
终止条件:f(1)=1 f(2)=1
递归问题的解题步骤:
- 分解子问题,找出递推公式
- 找出终止条件
具体代码的书写:
-
递归函数函数参数以及返回值(递归函数的参数为要进行处理的数据,返回值根据特定情况判断)
-
递归函数的终止条件(递归参数或者计数器之类的东东,注意返回的值)
94. 二叉树的中序遍历 - 力扣(LeetCode)
二叉树的中序遍历
中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点
对于本题我们需要返回二叉树的中序遍历的序列:
因此参数设置为:树节点,存储节点数值的数组
代码如下:
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);
}
}
};
二叉树的前序和后序遍历递归版本和上面的代码相似
题目链接: