当前位置: 首页 > news >正文

leetcode144 二叉树的前序遍历 递归法、迭代法

递归算法的三个要素

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

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

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

(1) 找出重复的子问题。

这个很好找,前序遍历的顺序是:根、左子树、右子树。

对于左子树或者右子树来说,也是同样的遍历顺序。

所以这个重复的子问题就出来了,先取根节点,再遍历左子树,最后遍历右子树

(2) 确定终止条件。

对于二叉树的遍历来说,想终止,即没东西遍历了,没东西遍历自然就停下来了。

那就是当前的节点是空的,既然是空的那就没啥好遍历。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
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;
    }
};
  1. 构造函数

    • TreeNode():默认构造函数,初始化节点值为 0,左右子节点为 nullptr

    • TreeNode(int x):初始化节点值为 x,左右子节点为 nullptr

    • TreeNode(int x, TreeNode* left, TreeNode* right):初始化节点值为 x,并指定左右子节点。

  • 你在 while (cur != NULL) 中递归调用了 Traversal 函数。

  • 这个 while 循环会导致无限递归,因为 cur 的值在递归调用中不会改变,while 循环的条件始终为真(除非 cur 一开始就是 nullptr)。

  • 正确的递归实现应该用 if 判断,而不是 while 循环。

迭代法:用栈,不断地将旧的变量值,递推计算新的变量值

  • 初始化维护一个栈,将根节点入栈。

  • 当栈不为空时

    • 弹出栈顶元素 node,将节点值加入结果数组中。

    • 若 node 的右子树不为空,右子树入栈。

    • 若 node 的左子树不为空,左子树入栈。

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> result;
        if(root == NULL) return result;
        st.push(root);
        while(!st.empty()){
            TreeNode* node = st.top();
            st.pop();
            result.push_back(node->val);

            if(node->right != NULL) st.push(node->right);
            if(node->left != NULL) st.push(node->left);
        }
        return result;
    }
};

TreeNode* node 的作用是 临时存储当前正在处理的二叉树节点。它是栈顶节点的副本,用于访问当前节点的值以及将其子节点压入栈中。

相关文章:

  • 一维数组的增删改查:对元素的影响
  • 解决pip安装uv时下载速度慢
  • 【嵌入式linux】网口和USB热插拔检测
  • qt之No executable specified
  • 【ES6】基础特性总结
  • 通义万相 2.1:AIGC 领域的 “王炸” 组合如何颠覆创作生态?
  • TDengine 使用教程:从入门到实践
  • Android控件Selector封装优化指南:高效实现动态UI效果
  • LLM训练中常用的Benchmarks
  • uvm_transaction, uvm_seq_item, uvm_object, uvm_component的关系
  • 仅仅使用pytorch来手撕transformer架构(3):编码器模块和编码器类的实现和向前传播
  • 前端高阶面试题·每日一题
  • 【大模型知识点】RMSNorm(Root Mean Square Normalization)均方根归一化
  • linux 命令 ls
  • AI模型的构建过程是怎样的(下)
  • 华为OD机试-乘坐保密电梯-回溯(Java 2024 C卷 200分)
  • 分布式锁技术全景解析:从传统锁机制到MySQL、Redis/Redisson与ZooKeeper实现
  • Python 配置文件管理库Hydra 和 OmegaConf的区别
  • 图形学面试题总结
  • Conda 常规用法指南
  • 被央视曝光“废旧厂区沦为垃圾山”,江西萍乡成立调查组查处
  • 取得金奖西瓜品种独家使用权的上海金山,为何要到异地“试种”?
  • 中国田径巡回赛西安站完赛:男子跳远石雨豪夺冠,女子跳高刘肼毅折桂
  • 种植耐旱作物、启动备用水源,甘肃各地多举措应对旱情
  • 出走的苏敏阿姨一路走到了戛纳,这块红毯因她而多元
  • 一条铺过11年时光的科学红毯,丈量上海科创的“长宽高”