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

For example:
Given binary tree {1,#,2,3},

   1
\
2
/
3

return [1,2,3].

二叉树的先序遍历。递归算法太简单了,重点讨论一下非递归的。

我自己写的时候一直纠结于何时弹出结点。后来看了几个版本的,发现可以跳过这个部分。

贴上我最喜欢的版本,逻辑最清楚

//我最喜欢的版本 逻辑清晰
vector<int> preorderTraversal3(TreeNode *root)
{
if (root==NULL) return vector<int>();
vector<int> result;
stack<TreeNode *> treeStack;
treeStack.push(root);
while (!treeStack.empty())
{
TreeNode *temp = treeStack.top();
result.push_back(temp->val);
treeStack.pop();
if (temp->right!=NULL) //先压入右子树,后压入左子树,只有非空的时候压入,这样处理后的根据栈的后进先出,自然就是先处理左子树,再处理右子树了
treeStack.push(temp->right);
if (temp->left!=NULL)
treeStack.push(temp->left);
}
return result;
}

很短的版本:

vector<int> preorderTraversal2(TreeNode *root)
{
vector<int> ans;
vector<TreeNode *> v;
TreeNode * p = root;
while(p != NULL)
{
ans.push_back(p->val);
if(p->right != NULL)
{
v.push_back(p->right);
}
p = p->left;
if(p == NULL && !v.empty())
{
p = v.back();
v.pop_back();
}
}
return ans;
}

我自己写的,很长很繁琐。不好。

vector<int> preorderTraversal(TreeNode *root) {
vector<int> ans;
if(root == NULL) return ans;
vector<TreeNode *> v;
v.push_back(root);
while(!v.empty())
{
TreeNode * p = v.back();
if(p == NULL) //前面的压入右子树的过程中会出现NULL
{
v.pop_back(); //把这个指针弹出
if(!v.empty())
{
p = v.back();
v.pop_back(); //把再上一个指针也弹出
v.push_back(p->right); //压入刚才被弹出指针的右子树
}
}
else
{
ans.push_back(p->val); //先读取值
if(p->left != NULL)
{
v.push_back(p->left); //左子树不为空 压入左子树
}
else
{
v.pop_back(); //否则弹出该节点 并压入右子树
v.push_back(p->right);
}
}
}
return ans;
}

【leetcode】Binary Tree Preorder Traversal (middle)★的更多相关文章

  1. 【LeetCode】Binary Tree Preorder Traversal

    Binary Tree Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' valu ...

  2. 【LeetCode】Binary Tree Preorder Traversal(二叉树的前序遍历)

    这道题是LeetCode里的第144道题. 题目要求: 给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很 ...

  3. 【LeetCode】Binary Tree Inorder Traversal

    Binary Tree Inorder Traversal Total Accepted: 16406 Total Submissions: 47212My Submissions Given a b ...

  4. 【Leetcode】【Medium】Binary Tree Preorder Traversal

    Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...

  5. 【题解】【BT】【Leetcode】Binary Tree Preorder/Inorder/Postorder (Iterative Solution)

    [Inorder Traversal] Given a binary tree, return the inorder traversal of its nodes' values. For exam ...

  6. 【leetcode】Binary Tree Postorder Traversal

    题目: Given a binary tree, return the postorder traversal of its nodes' values. For example: Given bin ...

  7. 【LeetCode】Binary Tree Postorder Traversal(二叉树的后序遍历)

    这道题是LeetCode里的第145道题. 题目要求: 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 进阶: 递归算法很 ...

  8. 【LeetCode】Binary Tree Inorder Traversal(二叉树的中序遍历)

    这道题是LeetCode里的第94道题. 题目要求: 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单 ...

  9. 【leetcode】Binary Tree Postorder Traversal (hard) ☆

    二叉树的后序遍历 用标记右子树vector的方法 vector<int> postorderTraversal(TreeNode *root) { vector<int> an ...

随机推荐

  1. [原] Intellij IDEA开发Android,祝还在使用eclipse的早日脱离苦海

    注: 现在推荐使用Android Studio,以后google在Android Studio上个性差异化的东西越来越多, 所以越早使用Android Studio越好,看看更新文档,使我们开发更方便 ...

  2. [设计模式] javascript 之 享元模式;

    享元模式说明 定义:用于解决一个系统大量细粒度对象的共享问题: 关健词:分离跟共享: 说明: 享元模式分单纯(共享)享元模式,以及组合(不共享)享元模式,有共享跟不共享之分:单纯享元模式,只包含共享的 ...

  3. [译]Mongoose指南 - 验证

    开始前记住下面几点 Validation定义在SchemaType中 Validation是一个内部的中间件 当document要save前会发生验证 验证不会发生在空值上 除非对应的字段加上了 re ...

  4. Shader 之 顶点变形

    可以使3D物体通过顶点变形弯曲,常见于跑酷游戏的跑道.可向左.右.上.下弯曲. Shader "Custom/VertexColorCurved" { Properties { / ...

  5. Javascript实现AutoComplete自动匹配功能

    功能分析: 避免客户端频繁的访问服务器,因此客户端需要一个timer,监听键盘按键间隔时间,300-600毫秒能够接受. 服务端对要查找的数据源如果不大的话,应该尽量缓存在服务端内存中,而不是每次查找 ...

  6. eclipse如何导入java项目文件

    平时下载到项目时,希望能够导入到eclipse中使用.但有些项目不能直接导入,需要做转换. 打开源文件目录,查询如下: 如果目录中包含pom.xml文件,则说明该项目由Maven构建的,参考以下 如何 ...

  7. media

    关于获取设备的大小问题: /* 本条为CSS2部分,IE8及以下只支持本条 */@media screen{ body{color:#f00;}}/* 下列为CSS3部分 */@media scree ...

  8. WebSocket帧数据 解码/转码

    数据从浏览器通过websocket发送给服务器的数据,是原始的帧数据,默认是被掩码处理过的,所以需要对其利用掩码进行解码. 从服务器发送给浏览器的数据是默认没有掩码处理的,只要符合一定结构就可以了.具 ...

  9. 深入理解Java虚拟机之读书笔记四 性能监控与故障处理工具

    JDK的bin目录下存在很多有效的命令行工具,它们就是jdk\lib\toos.jar类库的封装. 一.jps:虚拟机进程状况工具,查询出LVMID. 二.jstat:虚拟机统计信息监视工具, 三.j ...

  10. 客户端安全-xss-2解决方案

    1.需求 提供xss解决方案 2.方式 对需要显示在html中的用户代码进行编码 3.处理方案 1.用户的数据到后端前用下面的编码层代码进行编码. function htmlEncodeCharact ...