Time: 20190224

本题对应的是LeetCode 144,Medium难度(迭代算法的难度)。

树的前序遍历

Given a binary tree, return the preorder traversal of its nodes’ values.

Example:

Input: [1,null,2,3]1\2/3

Output: [1,2,3]

Follow up: Recursive solution is trivial, could you do it iteratively?

给定一棵二叉树,输出它的前序遍历。

用递归的写法非常简单,能否用迭代的思路解决这个问题?

题解与思路分析

虽然递归的解法很简单,还是先从这里出发。

struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};class Solution {public:void helper(TreeNode* root) {if (!root) {return;}res.push_back(root->val); // 访问根元素helper(root->left);helper(root->right);}vector<int> preorderTraversal(TreeNode* root) {helper(root);return res;}
private:vector<int> res;
}

仔细读一下这个代码,实际上是可以在脑海里模拟运行一下,然后得出迭代的版本的。

而前序遍历的迭代写法,相比于中序,后序要更简单。

根 – 左子树 – 右子树

将子树看做一个整体,并用栈来模拟递归的过程,先把根结点加载到栈中来,然后用一个while循环,直到栈空为止。栈是后入先出,所以先将右孩子结点压栈,再压左孩子结点,当然前提是存在。

class Solution {public:void helper(TreeNode* root) {if (!root) {return;}stack<TreeNode*> treeStack;treeStack.push(root);while (!treeStack.empty()) {TreeNode* temp = treeStack.top();res.push_back(temp->val);treeStack.pop(); // 访问完即弹出if (temp->right) {treeStack.push(temp->right);} if (temp->left) {treeStack.push(temp->left);}}}vector<int> preorderTraversal(TreeNode* root) {helper(root);return res;}
private:vector<int> res;
}

END.

LeetCode 144. 树的前序遍历迭代写法相关推荐

  1. [leetcode] 144. 二叉树的前序遍历

    144. 二叉树的前序遍历 递归写法 class Solution {public List<Integer> preorderTraversal(TreeNode root) {List ...

  2. LeetCode 144. 二叉树的前序遍历(递归)(迭代)(颜色标记法)

    题目描述 给定一个二叉树,返回它的前序遍历. 思路 详见链接 代码 递归法 #class TreeNode: # def __init__(self,x): # self.val = x # self ...

  3. LeetCode 144. 二叉树的前序遍历(前序遍历)

    文章目录 1. 题目信息 2. 解题 2.1 递归 2.2 循环,必须掌握 1. 题目信息 给定一个二叉树,返回它的 前序 遍历. 示例:输入: [1,null,2,3] 1\2/3 输出: [1,2 ...

  4. Leetcode 144. 二叉树的前序遍历 解题思路及C++实现

    解题思路: 这道题目的解题思路与中序遍历一模一样,区别只在于输出结果放在push进栈之前. 程序的大循环是遍历整个树,所以循环停止条件是:栈为空,且当前访问节点root为NULL,这时说明所有的跟节点 ...

  5. Leetcode 144. 二叉树的前序遍历 (每日一题 20210820)

    给你二叉树的根节点 root ,返回它节点值的 前序 遍历.示例 1:输入:root = [1,null,2,3] 输出:[1,2,3] 示例 2:输入:root = [] 输出:[] 示例 3:输入 ...

  6. [leetcode] 144.二叉树的前序遍历

    给你二叉树的根节点 root ,返回它节点值的 前序 遍历. 示例 1: 输入:root = [1,null,2,3] 输出:[1,2,3] 示例 2: 输入:root = [] 输出:[] 示例 3 ...

  7. LeetCode 144 ——二叉树的前序遍历

    1. 题目 2. 解答 2.1. 递归法 定义一个存放树中数据的向量 data,从根节点开始,如果节点不为空,那么 将当前节点的数值加入到 data 中 递归得到其左子树的数据向量 temp,将 te ...

  8. Leetcode 129求根节点到叶节点数字之和、104二叉树的最大深度、8字符串转换整数(atoi)、82删除排序链表中的重复元素II、204二分查找、94二叉树的中序遍历、144二叉树的前序遍历

    Top1:Leetcode 129求根节点到叶节点数字之和 官方题解:https://leetcode.cn/problems/sum-root-to-leaf-numbers/solution/qi ...

  9. 扁平化嵌套列表迭代器 [树的递归前序遍历 + 迭代前序遍历]

    递归|迭代的前序遍历 前言 一.扁平化嵌套列表迭代器 二.前序遍历(无需访问非叶节点) 1.递归实现 2.栈模拟 3.惰性栈模拟(next时再入栈) 总结 参考文献 前言 问题转换:将需求确认,结合已 ...

最新文章

  1. UA MATH564 概率论 QE练习题 信封问题
  2. Python-OpenCV 处理视频(三)(四)(五): 标记运动轨迹 运动检测 运动方向判断
  3. 计算机基础:计算机网络-socket编程
  4. python标准库之urllib, httplib, urllib2
  5. 安装程序无法创建新的系统分区
  6. Django—自定义分页
  7. 人工智能TensorFlow工作笔记009---认识TensorFlow中的会话
  8. 浅谈javascript和java中的字符串
  9. 多关键字排序的c语言编程,常见排序——“计数排序(三关键字)”的源程序(C语言版)...
  10. eclipse下载支持compiler compliance level 1.8的插件
  11. RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)
  12. TCP/IP详解 卷1:协议—概述
  13. HDU 5296 Annoying problem LCA+树状数组
  14. 高速计数器转RS485Modbus RTU模块IBF150
  15. 虚拟服务器 dmz区别,dmz主机和虚拟服务器区别(tp路由器虚拟服务器能干嘛)...
  16. 零零信安-DD数据泄露报警日报【第43期】
  17. 提高WhatsApp营销效果:文案篇
  18. 通俗易懂解释一类和二类错误(Type I Error Type II Error)
  19. python爬取王者_Python爬取王者荣耀所有英雄以及高清大图
  20. 百分号用计算机语言怎么表示,c++语言中 百分号如何输出 如要求输出50%

热门文章

  1. Course 2: 单视图计量
  2. yolov3前向传播(三)-- 坐标转换,iou计算,权重加载,图片显示
  3. 数据结构笔记(十五)-- 数组原理
  4. linux文件内核目录,Linux内核目录文件简介
  5. groupby多个字段性能_SQL 性能优化
  6. ansible 建 kubernetes 证书签名请求_Java中的微信支付(2):API V3 微信平台证书的获取与刷新...
  7. python动态创建变量
  8. oracle select输出dbms,PLSQL 中如何使用 dbms_output 输出结果
  9. 理光打印机如何设置邮件服务器,技术员帮您win10系统网络共享理光打印机的设置方法的操作办法...
  10. 学习java_java学习册之立FLAG