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. 淘宝首页源码藏美女彩蛋(下)(UED新作2013egg)

    我们已经知道,执行美女会得到"彩蛋",而正是彩蛋做到了taobaoUED展现给大家的神奇的前端魅力.今天我们来看看FP.egg&&FP.egg("%cjo ...

  2. EasyUI datagrid优化

    easyui datagrid 在IE上加载速度慢, 150行数据就无法忍受了. firefox加载速度还可以. jquery easyui datagrid使用参考 http://www.cnblo ...

  3. [设计模式] javascript 之 迭代子模式

    迭代子模式:定义 迭代子模式,又称游标模式,是一种用于对聚集进行顺序访问规则的模式,是一种行为模式:它用于提供对聚集对象的一种统一的访问接口,使客户能够在不了解聚集对象内部结构的情况对聚集对象进行访问 ...

  4. Apache服务器httpd.exe进程占用cpu超过50%的解决方法

    httpd.exe进程占用cpu超过50%,关闭掉Apache服务,cpu应用率立刻下降到0.  重新启动Apache又出现占用cpu高的情况.  原因是:httpd.exe和防火墙配置有冲突. 解决 ...

  5. Spark之集群搭建

    注意,这种安装方式是集群方式:然后有常用两种运行模式: standalone , on yarn 区别就是在编写 standalone 与 onyarn 的程序时的配置不一样,具体请参照spar2中的 ...

  6. mysql explain用法和结果的含义

    重点是第二种用法,需要深入的了解. 先看一个例子: mysql> explain select * from t_order; +----+-------------+---------+--- ...

  7. 原生js实现简单打字机效果

    快过年了,公司基本没活,闲着也是闲着,就写了一个 打字机效果玩玩,感觉挺有意思的. 具体代码 请参见我的github,请戳这里 预览效果,请戳这里

  8. spring边边角角

    我们在使用ssh框架的时候,很多人抱怨为什么之前都运行得好好的,第二天就报错了,我也是被这个问题纠结了很久. 我们来看看spring的配置文件: <?xml version="1.0& ...

  9. STM32通用定时器(转载)

    STM32的定时器功能很强大,学习起来也很费劲儿. 其实手册讲的还是挺全面的,只是无奈TIMER的功能太复杂,所以显得手册很难懂,我就是通过这样看手册:while(!SUCCESS){看手册-}才搞明 ...

  10. 2016年10月24日--HTML常用标签

    body的属性: bgcolor                页面背景色 background             背景壁纸.图片 text                     文字颜色 t ...