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

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

一、题目解析

对于递归方法的前序遍历十分简单,但对于一位合格的程序猿而言,需要掌握将递归转化为非递归的能力,毕竟递归调用的时候会调用大量的栈帧,存在栈溢出风险。

二、算法原理

递归调用本质是系统建立栈帧,而非递归则是用栈来存储数据,实现类似递归的效果。

首先,我们先简单了解一下递归调用时,是如何遍历的?

前序遍历,由根、左子树、右子树的顺序遍历,打印时直接打印根节点的值。

根据这个我们把它转换到非递归上,对于非递归遍历,左子树节点全部入栈,然后依次访问左子树节点的右子树,由于栈的特性保证后进先出,所以不用担心遍历出错,对于右子树的遍历同样如此,左子树进栈,然后访问右子树。

由此我们可以看出非递归本质上与递归没有多大差别。

三、代码示例

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*> st;TreeNode* cur = root;vector<int> v;while(cur || !st.empty()){//访问一棵树的开始//1.访问左路节点,左路节点入栈,后续依次访问左路节点的右子数while(cur){v.push_back(cur->val);st.push(cur);cur = cur->left;}//依次访问左路节点的右子树TreeNode* top = st.top();st.pop();//子问题的方式访问右子树cur = top->right;}return v;}
};

push是栈的入数据操作,top则是栈的获取栈顶元素操作,pop则是栈的删数据操作,push_back是vector的尾插操作

 

四、非递归遍历流程

 

 看到最后,如果对您有所帮助,还请点赞、收藏和关注,点点关注不迷路,我们下期再见!

 

http://www.xdnf.cn/news/13110.html

相关文章:

  • sql server连接遇到的问题
  • 【Java_EE】Spring MVC
  • C#中LINQ技术:自然语言集成与统一数据操作的艺术
  • CSS 布局指南
  • 函数01 day10
  • 数字孪生+AR/VR的融合创新
  • yolo模型精度提升策略
  • Vue数据响应式原理解析
  • 华为云Flexus+DeepSeek征文|体验华为云ModelArts快速搭建Dify-LLM应用开发平台并创建自己的AI-Agent
  • 安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
  • docker容器互联
  • Python----大模型(大模型基础)
  • Linux学习
  • 如何为服务器生成TLS证书
  • 【C++进阶篇】智能指针
  • DIC 应变测量系统助力混凝土 / 岩石断裂力学性能深度研究
  • 第2篇:BLE 广播与扫描机制详解
  • 【iSAQB软件架构】复杂系统架构描述的推荐实践
  • 在 Windows 11 上恢复旧版 Windows 10 右键菜单的命令
  • OPENCV形态学基础之二腐蚀
  • 使用python进行图像处理—图像滤波(5)
  • 常见的Linux命令
  • vue3 定时器-定义全局方法 vue+ts
  • 人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
  • pm2部署Nuxt项目!
  • 开放词汇检测分割YOLOE从pytorch到caffe
  • Clean Code 学习总结01 - 物理设计与命名艺术
  • [Java 基础]String 类
  • MCP和Function Calling
  • OpenCV CUDA模块光流计算-----实现Farneback光流算法的类cv::cuda::FarnebackOpticalFlow