144. Binary Tree Preorder Traversal

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

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

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

class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
if(root == NULL)
return result;
stack<TreeNode*> sta;
sta.push(root);
while(!sta.empty()){
TreeNode* node = sta.top();
sta.pop();
result.push_back(node->val);
if(node->right)
sta.push(node->right);
if(node->left)
sta.push(node->left);
}
return result;
}
};

94. Binary Tree Inorder Traversal

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

class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> container;
TreeNode* cur = root;
while(cur || !container.empty()){
while(cur){
container.push(cur);
cur = cur->left;
}
cur = container.top();
container.pop();
result.push_back(cur->val);
cur = cur->right;
}
return result;
}
};

145. Binary Tree Postorder Traversal

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

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

class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
if(root == NULL)
return result;
stack<TreeNode*> sta;
sta.push(root);
while(!sta.empty()){
TreeNode* node = sta.top();
sta.pop();
result.insert(result.begin(),node->val);
if(node->left)
sta.push(node->left);
if(node->right)
sta.push(node->right);
}
return result;
}
};

173. Binary Search Tree Iterator

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

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

class BSTIterator {
public:
BSTIterator(TreeNode* root) {
while(root){
sta.push(root);
root = root->left;
}
} /** @return the next smallest number */
int next() {
TreeNode* node = sta.top();
sta.pop();
TreeNode* root = node->right;
while(root){
sta.push(root);
root = root->left;
}
return node->val;
} /** @return whether we have a next smallest number */
bool hasNext() {
return !sta.empty();
}
stack<TreeNode*> sta;
};

二叉树前序、中序、后序非递归遍历 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. Azure Java Libraries 入门

    本指南演示了以下 Azure Java Libraries 的用法,包括设置认证.创建并使用 Azure 存储.创建并使用 Azure SQL 数据库.部署虚拟机.从 GitHub 部署 Azure ...

  2. Heka 的 CMake 编译配置分析

    CMake 是一个跨平台的自动化建构系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件.   CMakeLists.txt 的语法比较简单,由命令.注释和 ...

  3. git新建分支没有master分支,其他分支也看不到

    git checkout -b dev git新建dev分支,发现切换到了dev分支,但是master分支没有了 git branch和git branch -a 都没有任何反应,看不到其他分支, g ...

  4. javascript时间格式转换(今天,昨天,前天)

    function transDate() { var $time =document.getElementById("share-time"); var date = $time. ...

  5. 02_zookeeper配置

    [zoo.cfg] * tickTime:用于计算的时间单元.比如session超时:N*tickTime * initLimit:用于集群,允许从节点连接并且同步到master节点的初始化连接时间, ...

  6. Python爬虫教程-19-数据提取-正则表达式(re)

    本篇主页内容:match的基本使用,search的基本使用,findall,finditer的基本使用,匹配中文,贪婪与非贪婪模式 Python爬虫教程-19-数据提取-正则表达式(re) 正则表达式 ...

  7. JavaScript中的原型和原型链

    1.原型是什么?原型链是什么? 原型是一个prototype对象,用于表示类型之间的关系: 原型链指的是在JavaScript中对象之间的继承是通过prototype对象指向父类对象,直到指向Obje ...

  8. 使用github参与到开源项目的维护

    参与到开源项目的维护工作一般分两种,一种是由项目建立者拉入到贡献者列表中,拥有对项目的读写权限,而普通用户对项目仅有读取权限,另一种是fork项目到自己仓库,然后把修改后的内容发送给项目管理者者请求合 ...

  9. 论组织资源 #F315

    论组织资源 #F315 2016-02-29 yevon_ou 水库论坛 论组织资源  #F315 首先,让我们看一段长微博. 转:五毛大战美分,基层民猪那破事... 就是小区业委会的事,根据业委会相 ...

  10. SQL点点滴滴_常用函数

    该文章转载自http://www.cnblogs.com/jiajiayuan/archive/2011/06/16/2082488.html 别人的总结,很详细. 以下所有例子均Studnet表为例 ...