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

二叉树-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的尾插操作

 

四、非递归遍历流程

 

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

 

相关文章:

  • 命令行关闭Windows防火墙
  • C++11委托构造函数和继承构造函数:从入门到精通
  • 个人自用debian启动
  • 基于Springboot+Vue的办公管理系统
  • SSH协议与应用
  • Java HttpClient实现简单网络爬虫
  • Spring Boot Admin监控
  • 《创客匠人助力商学教育:从0到1的转型之路》
  • 现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
  • 代码随想录算法训练营第60期第六十三天打卡
  • Python竞赛环境搭建全攻略
  • 机械狗面对实际应用的挑战-自主SLAM导航
  • GB/T 43887-2024 核级柔性石墨板材检测
  • 小智AI+MCP
  • 打造高效能技术组织的逆向法则
  • Rsync+inotify+nfs实现数据实时备份方案
  • 内网im,局域网环境下BeeWorks 如何保障数据安全?
  • 昇腾CANN集合通信技术解读——细粒度分级流水算法
  • C++ 类基础:封装、继承、多态与多线程模板实现
  • 突然无法调用scikit-learn、xgboost
  • 个人网站开发协议/开网店如何运营和推广
  • 定制型网站一般价格/旺道营销软件
  • 专业推广运营公司/什么是seo优化推广
  • 建行网站会员/百度关键词优化企业
  • 番禺网站建设优化推广/足球世界积分榜
  • 零成本做网站/旺道seo怎么优化网站