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

LeetCode - 144. 二叉树的前序遍历

目录

题目

什么是前序遍历

递归的写法

非递归的写法

思路

实现 


题目

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

什么是前序遍历

前序遍历(Preorder Traversal)是一种遍历树形结构的方法,特别是在二叉树中常用。它的遍历顺序为:

  • 先访问根节点
  • 然后递归地前序遍历左子树
  • 最后递归地前序遍历右子树

这种遍历方式也称为"深度优先遍历"(DFS)的一种形式。

示例

对于以下二叉树:

    A/ \B   C/ \   \
D   E   F

前序遍历的结果是:A → B → D → E → C → F

递归的写法

vector<int> preorderTraversal(TreeNode* root) {vector<int> result;preorder(root, result);return result;
}void preorder(TreeNode* node, vector<int>& result) {if (node == nullptr) {return;}// 前序遍历顺序:根 -> 左 -> 右result.push_back(node->val);  // 访问根节点preorder(node->left, result);  // 递归访问左子树preorder(node->right, result);  // 递归访问右子树
}

非递归的写法

思路

初始化:

  • 创建一个空的结果数组 result 用于存储遍历结果
  • 创建一个栈 stack 用于存储待访问的节点
  • 检查根节点是否为空,如果为空直接返回空结果

算法流程:

  • 将根节点压入栈中
  • 当栈不为空时,重复以下步骤:

弹出栈顶节点 current

将 current 的值加入结果数组(访问当前节点)

关键点:先将右子节点压栈,再将左子节点压栈

  • 这是因为栈是后进先出(LIFO)的数据结构
  • 我们希望左子节点先于右子节点被处理,所以右子节点要先入栈

继续循环,直到栈为空

为什么这样工作:

  • 每次我们弹出一个节点,立即访问它(符合前序的"先访问根"原则)
  • 然后将其子节点以"右-左"顺序压栈,这样出栈顺序就是"左-右"
  • 这保证了对于每个子树,我们都是按照"根-左-右"的顺序访问

复杂度分析:

  • 时间复杂度:O(n),其中 n 是树中的节点数,每个节点被访问一次
  • 空间复杂度:O(h),其中 h 是树的高度,最坏情况下为 O(n)(树完全不平衡)

实现 

vector<int> preorderTraversal(TreeNode* root) {vector<int> result;if (root == nullptr) {return result;}stack<TreeNode*> st;st.push(root);while (!st.empty()) {// 弹出栈顶节点并访问TreeNode* node = st.top();st.pop();result.push_back(node->val);// 注意:先压入右子节点,再压入左子节点// 这样出栈时才会先处理左子节点(栈是后进先出)if (node->right) {st.push(node->right);}if (node->left) {st.push(node->left);}}return result;
}
http://www.lqws.cn/news/90199.html

相关文章:

  • 电工基础【5】简单的电路设计接线实操
  • python直方图
  • 转战web3远程工作的英语学习的路线规划
  • 安全-JAVA开发-第一天
  • 数据可视化有哪些步骤?2025高效落地指南
  • 5分钟申请edu邮箱【方案本周有效】
  • 业务材料——半导体行业MES系统核心功能工业协议AI赋能
  • 深入解析C++引用:从别名机制到函数特性实践
  • TablePlus:一个跨平台的数据库管理工具
  • 04 APP 自动化- Appium toast 元素定位列表滑动
  • MATLAB仿真生成无线通信网络拓扑推理数据集
  • Ansys Zemax | 手机镜头设计 - 第 3 部分:使用 STAR 模块和 ZOS-API 进行 STOP 分析
  • Linux运维笔记:1010实验室电脑资源规范使用指南
  • PHP+mysql 美容美发预约小程序源码 支持DIY装修+完整图文搭建教程
  • Android系统进程优先级
  • 帝国CMS QQ登录插件最新版 获取QQ头像和QQ昵称
  • Python训练打卡Day41
  • 基于VLC的Unity视频播放器(四)
  • window 显示驱动开发-DirectX 视频加速 2.0
  • MATLAB实战:四旋翼姿态控制仿真方案
  • 榕壹云健身预约系统:多门店管理的数字化解决方案(ThinkPHP+MySQL+UniApp实现)
  • Ubuntu 系统部署 MySQL 入门篇
  • 碰一碰发视频-源码系统开发技术分享
  • 阿里云百炼全解析:一站式大模型开发平台的架构与行业实践
  • Dockerfile 使用多阶段构建(build 阶段 → release 阶段)后端配置
  • 深入剖析物联网边缘计算技术:架构、应用与挑战
  • mapbox高阶,生成并加载等时图
  • 【请关注】MySQL 中常见的加锁方式及各类锁常见问题及对应的解决方法
  • RNN结构扩展与改进:从简单循环网络到时间间隔网络的技术演进
  • YOLO-V2 (学习记录)