[路飞]_leetcode-144-二叉树的前序遍历-迭代算法

简介: leetcode-144-二叉树的前序遍历-迭代算法

网络异常,图片无法展示
|


[题目地址][B站地址]


给你二叉树的根节点 root ,返回它节点值的 前序 **遍历。


示例 1:


网络异常,图片无法展示
|


输入: root = [1,null,2,3]
输出: [1,2,3]
复制代码


示例 2:


输入: root = []
输出: []
复制代码


示例 3:


输入: root = [1]
输出: [1]
复制代码


示例 4:


网络异常,图片无法展示
|


输入: root = [1,2]
输出: [1,2]
复制代码


示例 5:


网络异常,图片无法展示
|


输入: root = [1,null,2]
输出: [1,2]
复制代码


提示:


  • 树中节点数目在范围 [0, 100]
  • -100 <= Node.val <= 100


进阶: 递归算法很简单,你可以通过迭代算法完成吗?


针对本题之前写过一篇题解文章,因为题目过于简单,没有完整读题,导致没注意到进阶要求,今天主要讲解下如果通过迭代算法实现二叉树的前序遍历。


首先我们来看一下前序遍历的过程:


网络异常,图片无法展示
|


可以看到,如果当前节点有左子树,会优先处理左子树,直到叶子节点位置,然后会处理与之对应的右子树。


如果右子树有左子树,依然优先处理左子树,然后处理与之对应的右子树。


然后继续向上回溯处理父节点的右子树,直到回溯到根节点,处理根节点的右子树。


所以,我们可以从根节点开始迭代,将根节点的值放入到结果数组中,然后将根节点入栈,然后向下处理当前节点的左子树,直到叶子节点位置。


此时,栈顶保存的就是当前叶子节点,将栈顶元素弹出,当前节点更新为栈顶元素的右子树,因为该节点为叶子节点,所以右子树为空,此时继续弹出栈顶元素,此时栈顶元素为叶子节点的父节点,将当前元素更新为它的右子树。


右子树处理到最后依然会来到叶子节点,此时栈顶元素为该叶子节点,弹出该节点,因为该节点为叶子节点,所以右子树为空,继续弹出栈顶元素,则继续向上回溯。


整个遍历过程一直重复这样的过程,直到处理完整棵二叉树的最右侧节点,此时栈为空且当前节点为空,结束循环,完成二叉树的前序遍历。


动画演示如下:


网络异常,图片无法展示
|


代码如下:


var preorderTraversal = function(root) {
  // 特判如果是空树,返回空数组
  if(root===null) return [];
  // 初始化结果数组 栈
  const res = [],stack = [];
  // 当当前节点不为空或者栈不为空的时候,遍历二叉树
  while(root!==null || stack.length){
    // 如果当前节点不为空,处理它的左子树
    while(root!==null){
      res.push(root.val);
      stack.push(root);
      root = root.left;
    }
    // 如果当前节点没有左子树,向上回溯处理父节点的右子树
    root = stack.pop().right;
  }
  // 返回结果数组
  return res;
};
复制代码


至此我们就完成了 leetcode-144-二叉树的前序遍历-迭代算法


如有任何问题或建议,欢迎留言讨论!

相关文章
|
7天前
|
资源调度 算法 数据可视化
基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF
本项目基于MATLAB2022A实现IEKF迭代扩展卡尔曼滤波算法的数据跟踪仿真,对比EKF和UKF的性能。通过仿真输出误差收敛曲线和误差协方差收敛曲线,展示三种滤波器的精度差异。核心程序包括数据处理、误差计算及可视化展示。IEKF通过多次迭代线性化过程,增强非线性处理能力;UKF避免线性化,使用sigma点直接处理非线性问题;EKF则通过一次线性化简化处理。
|
4月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
5月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
55 2
|
5月前
【LeetCode 43】236.二叉树的最近公共祖先
【LeetCode 43】236.二叉树的最近公共祖先
41 0
|
5月前
【LeetCode 38】617.合并二叉树
【LeetCode 38】617.合并二叉树
35 0
|
5月前
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树
38 0
|
5月前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
45 0
|
5月前
【LeetCode 32】111.二叉树的最小深度
【LeetCode 32】111.二叉树的最小深度
37 0
|
6月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
7月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
165 2

热门文章

最新文章