144. Binary Tree Preorder Traversal

前序的非递归遍历:用堆来实现

如果把这个代码改成先向堆存储左节点再存储右节点,就变成了每一行从右向左打印

如果用队列替代堆,并且先存储左节点,再存储右节点,就变成了逐行打印

  1. class Solution {
  2. public:
  3. vector<int> preorderTraversal(TreeNode* root) {
  4. vector<int> result;
  5. if(root == NULL)
  6. return result;
  7. stack<TreeNode*> sta;
  8. sta.push(root);
  9. while(!sta.empty()){
  10. TreeNode* node = sta.top();
  11. sta.pop();
  12. result.push_back(node->val);
  13. if(node->right)
  14. sta.push(node->right);
  15. if(node->left)
  16. sta.push(node->left);
  17. }
  18. return result;
  19. }
  20. };

94. Binary Tree Inorder Traversal

思路:用一个变量node记录当前节点,每次先遍历并存储所有的左节点直到为空,然后栈里顶部存储的那个节点就是最近父节点,然后再去遍历一个右节点,在右节点中继续寻找左节点

  1. class Solution {
  2. public:
  3. vector<int> inorderTraversal(TreeNode* root) {
  4. vector<int> result;
  5. stack<TreeNode*> container;
  6. TreeNode* cur = root;
  7. while(cur || !container.empty()){
  8. while(cur){
  9. container.push(cur);
  10. cur = cur->left;
  11. }
  12. cur = container.top();
  13. container.pop();
  14. result.push_back(cur->val);
  15. cur = cur->right;
  16. }
  17. return result;
  18. }
  19. };

145. Binary Tree Postorder Traversal

http://www.cnblogs.com/grandyang/p/4251757.html的第二种方法

思路:前序遍历是中->左->右,后序遍历是左->右->中。在前序遍历的基础上,insert到begin的方式相当于把顺序全调换了,即变成了右->左->中,这个时候只需要再调换依稀右和左就能变成后序遍历的顺序。

  1. class Solution {
  2. public:
  3. vector<int> postorderTraversal(TreeNode* root) {
  4. vector<int> result;
  5. if(root == NULL)
  6. return result;
  7. stack<TreeNode*> sta;
  8. sta.push(root);
  9. while(!sta.empty()){
  10. TreeNode* node = sta.top();
  11. sta.pop();
  12. result.insert(result.begin(),node->val);
  13. if(node->left)
  14. sta.push(node->left);
  15. if(node->right)
  16. sta.push(node->right);
  17. }
  18. return result;
  19. }
  20. };

173. Binary Search Tree Iterator

这个题其实就是中序非递归遍历,并且就是另一种写法的实现,也就是先在循环外将左节点全部装入stack

注意:初始化只是将第一次所有的左节点装入stack,next是一次一次的递归

  1. class BSTIterator {
  2. public:
  3. BSTIterator(TreeNode* root) {
  4. while(root){
  5. sta.push(root);
  6. root = root->left;
  7. }
  8. }
  9.  
  10. /** @return the next smallest number */
  11. int next() {
  12. TreeNode* node = sta.top();
  13. sta.pop();
  14. TreeNode* root = node->right;
  15. while(root){
  16. sta.push(root);
  17. root = root->left;
  18. }
  19. return node->val;
  20. }
  21.  
  22. /** @return whether we have a next smallest number */
  23. bool hasNext() {
  24. return !sta.empty();
  25. }
  26. stack<TreeNode*> sta;
  27. };

二叉树前序、中序、后序非递归遍历 144. Binary Tree Preorder Traversal 、 94. Binary Tree Inorder Traversal 、145. Binary Tree Postorder Traversal 、173. Binary Search Tree Iterator的更多相关文章

  1. 算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序

    接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public ...

  2. 二叉树 遍历 先序 中序 后序 深度 广度 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. 145.Binary Tree Postorder Traversal---二叉树后序非递归遍历

    题目链接 题目大意:后序遍历二叉树. 法一:普通递归,只是这里需要传入一个list来存储遍历结果.代码如下(耗时1ms): public List<Integer> postorderTr ...

  4. 前、中、后序遍历随意两种是否能确定一个二叉树?理由? && 栈和队列的特点和区别

    前序和后序不能确定二叉树理由:前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力,因此得到这两个序列只能明确父子关系,而不能确定一个二叉树. 由二叉树的中序和前序遍历序列 ...

  5. SDUT 1489 求二叉树的先序遍历 (中序后序还原二叉树)

    求二叉树的先序遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description  已知一 ...

  6. 前序+中序->后序 中序+后序->前序

    前序+中序->后序 #include <bits/stdc++.h> using namespace std; struct node { char elem; node* l; n ...

  7. SDUT OJ 数据结构实验之二叉树八:(中序后序)求二叉树的深度

    数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

  8. SDUT-2804_数据结构实验之二叉树八:(中序后序)求二叉树的深度

    数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一颗二叉树的中序 ...

  9. URAL 1136 Parliament 二叉树水题 BST后序遍历建树

    二叉树水题,特别是昨天刚做完二叉树用中序后序建树,现在来做这个很快的. 跟昨天那题差不多,BST后序遍历的特型,找到最后那个数就是根,向前找,比它小的那块就是他的左儿子,比它大的那块就是右儿子,然后递 ...

随机推荐

  1. unity 中 protobuff 的用法 一句话攻略

    (一)unity 添加 pb 的 dll 支持.1,从GitHub上下载protobuf源码 (源码链接:https://github.com/google/protobuf),找到 csharp 分 ...

  2. Expression Blend实例中文教程(13) - 控件模板快速入门ControlTemplates

    上篇,介绍了控件样式(Style)和模板(Template)的基础概念,并且演示了使用Blend设计控件样式.本篇将继续介绍使用Blend设计自定义控件模板 - ControlTemplate.Con ...

  3. 在 Azure WebApps 中运行64位 Asp.net Core 应用

    作为微软下一代的开源的跨平台的开发框架, Asp.net core 正在吸引越来越多的开发者基于其构建现代 web 应用. 目前, Azure App Service 也实现了对 asp.net co ...

  4. 数据结构(四)--- 红黑树(RedBlock-Tree)

      文章图片来自邓俊辉老师课件 先提几个问题去思考学习本文 : 红黑树和2-4树(B-Tree)很像,那么它存在的动机又是什么呢 插入和删除操作的逻辑又是怎么样的,时间和空间复杂度可以达到怎么样 和 ...

  5. 一:HttpClient知识整理

    一:httpclient 简介 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支 ...

  6. 七、集成swagger2

    1.添加依赖 <!-- swager2 --> <dependency> <groupId>io.springfox</groupId> <art ...

  7. Spring学习笔记:Spring整合Mybatis(mybatis-spring.jar)(二:mybatis整合spring)

    http://blog.csdn.net/qq598535550/article/details/51703190 二.Spring整合mybatis其实是在mybatis的基础上实现Spring框架 ...

  8. cf1037E. Trips(图论 set)

    题意 题目链接 Sol 倒着考虑!倒着考虑!倒着考虑! 显然,一个能成为答案的子图一定满足,其中任意节点的度数\(>= k\) 那么倒着维护就只用考虑删除操作,如果一个点不合法的话就把它删掉,然 ...

  9. 关于tr:hover变色的问题

    最近在给table里面的tr标签添加高亮背景色显示的时候,遇到一个坑,HTML结构如下: <tr> <td></td> <td></td> ...

  10. 基于Tag的Docker自动构建

    构建规则 一旦您的Tag符合“release-v$version"的形式,将触发自动构建:1)若您有$version相关的Tag构建规则,则以$version的Tag规则帮您构建:2)若您没 ...