数据结构和算法——递归

递归是一种应用非常广泛的算法(或者编程技巧)。很多数据结构和算法的编码实现都要用到递归,比如 DFS 深度优先搜索、前中后序二叉树遍历等等。

递归问题需要具备的特征:

  1. 145. 二叉树的后序遍历 - 力扣(LeetCode)一个问题可以分解为几个子问题的解
  2. 问题和子问题的规模不同,解题思路完全一致
  3. 存在递归终止条件

例如:现在你处于电影院看电影,你想知道自己是第几排,那么你可以问前一排的人是第几排,在他的基础上加1就是答案,那么本例子的子问题就是前一排是第几排,终止条件为到第一排时,第一排的人自然知道自己是第一排。

去的过程为递

回来的过程为归

递归问题主要得找出递归公式:

在上个例子中:

你在的排数=前一排人的排数+1

就是递推公式。

经典的递归问题:斐波那契数列

递推公式:f(n)=f(n-1)+f(n-2)

终止条件:f(1)=1 f(2)=1 

递归问题的解题步骤:

  1. 分解子问题,找出递推公式
  2. 找出终止条件

具体代码的书写:

  1. 递归函数函数参数以及返回值(递归函数的参数为要进行处理的数据,返回值根据特定情况判断)

  2. 递归函数的终止条件(递归参数或者计数器之类的东东,注意返回的值)

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);
    }
}
};

二叉树的前序和后序遍历递归版本和上面的代码相似

题目链接:

144. 二叉树的前序遍历 - 力扣(LeetCode)

145. 二叉树的后序遍历 - 力扣(LeetCode)
 

Guess you like

Origin blog.csdn.net/qq_53633989/article/details/130450654