二叉树の递归遍历

学习一下卡哥的递归思路

原帖:二叉树的递归遍历 | 递归 | 二叉树遍历 | 代码随想录-全网最全算法数据结构刷题学习路线|图文+视频教程|免费开源

每次写递归,都按照这三要素来写

确定递归函数的参数和返回值

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

确定终止条件

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

确定单层递归的逻辑

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

以前序遍历为列子

1、确定递归函数的参数和返回值

应该是传入一个节点,然后把节点的值存入一个容器

所以我们有两个输入,没有

2、确定终止条件

就是遍历到空的节点了就终止

3、确定单层递归的逻辑

对于前序遍历,保证中左右的顺序,显示中间的值存入,然后去到左子树,左子树处理 完后去到右子树。

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

以此类推可得中序和后序

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

熟悉上述递归操作后就可以完成LeetCode.144/145/94 前后中序的题目。

相关推荐
落樱弥城1 分钟前
FlashAttention 完全解析:从 Roofline 诊断到 CUDA 实现
人工智能·算法
FelixZhang02810 分钟前
不懂金融或不会编程,如何开始量化?从策略搭建到回测验证
人工智能·python·算法·数学建模·均值算法·自然语言处理·金融
Mortalbreeze33 分钟前
0 - 1 BFS 算法详解:从基本原理到经典题目建模
数据结构·c++·算法·图论·宽度优先
飞Link2 小时前
什么是 PX4?一文了解 PX4 在空地协同中的作用
算法·无人机
一去不复返的通信er9 小时前
力扣-图论-岛屿数量
算法·leetcode·图论
程序 代码狂人12 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
HDU-Dade12 小时前
【校招笔试真题】简要介绍 Self-Attention 的前沿算法
人工智能·算法
小郎君65814 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
算法
邵奈一15 小时前
GPT-6.1 Terra速度是Sol的3倍,价格减半
算法