【Day23-慢就是快】代码随想录-二叉树-递归遍历

本篇介绍前后中序的递归写法。

递归算法三要素:

  1. 确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。

  2. 确定终止条件:写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。

  3. 确定单层递归的逻辑:确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

以前序遍历为例:

1. 确定递归函数的参数和返回值:因为要打印出前序遍历节点的数值,所以参数里需要传入vector来放节点的数值,除了这一点就不需要再处理什么数据了也不需要有返回值,所以递归函数返回类型就是void,代码如下:

cpp 复制代码
void traversal(TreeNode* cur, vector<int>& vec)
  1. 确定终止条件:在递归的过程中,如何算是递归结束了呢,当然是当前遍历的节点是空了,那么本层递归就要结束了,所以如果当前遍历的这个节点是空,就直接return,代码如下:
cpp 复制代码
if(cur == NULL) return;
  1. 确定单层递归的逻辑:前序遍历是中左右的循序,所以在单层递归的逻辑,是要先取中节点的数值,代码如下:
cpp 复制代码
vec.push_back(cur->val);
traversal(cur->left, vec);
traversal(cur->right, vec);

完整代码:

cpp 复制代码
class Solution{
public:
    void traversal(TreeNode* cur, vector<int>& vec){
        if(cur == NULL) return;
        vec.push_back(cur->val);
        traversal(cur->left, vec);
        traversal(cur->right, vec);
    }

    vector<int> preorderTraversal(TreeNode* root){
        vector<int> result;
        traversal(root, result);
        return result;
    }

};
相关推荐
Liu6288821 小时前
C++中的工厂模式高级应用
开发语言·c++·算法
AI科技星21 小时前
全尺度角速度统一:基于 v ≡ c 的纯推导与验证
c语言·开发语言·人工智能·opencv·算法·机器学习·数据挖掘
条tiao条1 天前
KMP 算法详解:告别暴力匹配,让字符串匹配 “永不回头”
开发语言·算法
干啥啥不行,秃头第一名1 天前
C++20概念(Concepts)入门指南
开发语言·c++·算法
tobias.b1 天前
计算机基础知识-数据结构
java·数据结构·考研
zzh940771 天前
Gemini 3.1 Pro 硬核推理优化剖析:思维织锦、动态计算与国内实测
算法
2301_807367191 天前
C++中的解释器模式变体
开发语言·c++·算法
愣头不青1 天前
617.合并二叉树
java·算法
MIUMIUKK1 天前
双指针三大例题
算法
灵感__idea1 天前
Hello 算法:复杂问题的应对策略
前端·javascript·算法