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

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

   1
\
2
/
3

return [3,2,1].

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

这道题想了很久,后序遍历应该是最麻烦的吧,最容易想到的方法就是直接设置标志位。

相比于前序遍历,后续遍历思维上难度要大些,前序遍历是通过一个stack,首先压入父亲结点,然后弹出父亲结点,并输出它的value,之后压人其右儿子,左儿子即可。然而后序遍历结点的访问顺序是:左儿子 -> 右儿子 -> 自己。那么一个结点需要两种情况下才能够输出:第一,它已经是叶子结点;第二,它不是叶子结点,但是它的儿子已经输出过。那么基于此我们只需要记录一下当前输出的结点即可。对于一个新的结点,如果它不是叶子结点,儿子也没有访问,那么就需要将它的右儿子,左儿子压入。如果它满足输出条件,则输出它,并记录下当前输出结点。输出在stack为空时结束。

网上看到一种简洁的方法,如果一个节点的左子树或右子树入栈后,就将其相应的左子树或右子树设置为NULL,思想简单,代码也简单,代码如下:

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> stk;
TreeNode* flag=root;
if(root==NULL)
return res;
stk.push(root);
while(!stk.empty())
{
flag=stk.top();
if(flag->left!=NULL)
{
stk.push(flag->left);
flag->left=NULL;
}
else if(flag->right!=NULL)
{
stk.push(flag->right);
flag->right=NULL;
}
else
{
res.push_back(flag->val);
stk.pop(); }
}
return res;
}
};

  设立标志位的解法如下:

/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> postorderTraversal(TreeNode *root) {
vector<int> result;
stack<TreeNode*> node;
stack<int> nodeStatus; if(root != NULL){
node.push(root);
nodeStatus.push();
} while(!node.empty()){
TreeNode* n = node.top();
node.pop();
int status = nodeStatus.top();
nodeStatus.pop(); if(status == ){
node.push(n);
nodeStatus.push();
if(n->right != NULL){
node.push(n->right);
nodeStatus.push();
}
if(n->left != NULL){
node.push(n->left);
nodeStatus.push();
}
}
else{
result.push_back(n->val);
}
} return result;
}

  

最新文章

  1. ABP教程-对Person信息进行操作
  2. 使用React制作一个可配置的页面生成器[0]
  3. IOS网络第二天 - 04-黑酷-GDataXML 解析
  4. 使用多文档接口(Multiple Document Interface) 一
  5. 大话 JSON 之 JSONObject.getString(“”) 方法 和 JSONObject.optString(“”) 的区别
  6. 编译原理(简单自动词法分析器LEX)
  7. 省略号 对单行 多行的css
  8. Spring 4 官方文档学习(十一)Web MVC 框架之约定优于配置
  9. Dynamic CRM 2013学习笔记(八)过滤查找控件 (类似省市联动)
  10. 为什么说外卖O2O行业的未来在于尖端技术?
  11. php如何支持实现多线程并发
  12. 在多线程中进行UI操作
  13. svn 相关
  14. cache数据库学习周结
  15. CSAPP 第二章随笔
  16. 【朝花夕拾】Handler篇
  17. Git的初步学习
  18. Go语言之高级篇beego框架之Controller
  19. mac上Python多版本共存(python2.7.10和python3.5.0)
  20. Spring boot 导出Excel

热门文章

  1. React高阶组件总结
  2. HDU 2852 主席树
  3. ZOJ 2532 Internship 求隔边
  4. android 应用使用Root权限执行linux命令
  5. c++11新特性之nullptr
  6. 宽度搜索(BFS)中求最短路径问题理解记录
  7. STM32之窗口看门狗
  8. Python os.walk文件遍历
  9. [技巧篇]01.Servlet的优化模版代码
  10. 图论:最短路-SPFA