题目:

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?

解题思路:

后序遍历的非递归实现与前序遍历和中序遍历的非递归不同,对于根节点,必须当其右孩子都访问完毕后才能访问,所以当根节点出栈时,要根据标志位判断是否为第一次出栈,如果是,则将其标志位置为FALSE,然后再次入栈,先访问其右孩子,当某个节点出栈时且其标志位为false,说明该节点为第二次出栈,即表示其右孩子都已处理完毕,可以访问当前节点了

实现代码:

#include <iostream>
#include <vector>
#include <stack>
using namespace std; /**
Given a binary tree, return the postorder traversal of its nodes' values.
*/ struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
}; void addNode(TreeNode* &root, int val)
{
if(root == NULL)
{
TreeNode *node = new TreeNode(val);
root = node;
}
else if(root->val < val)
{
addNode(root->right, val);
}
else if(root->val > val)
{
addNode(root->left, val);
}
} void printTree(TreeNode *root)
{
if(root)
{
cout<<root->val<<" ";
printTree(root->left);
printTree(root->right);
}
}
struct Node
{
TreeNode *treeNode;
bool isFirst;
}; class Solution {
public:
vector<int> postorderTraversal(TreeNode *root) {
vector<int> ivec;
if(root)
{
stack<Node*> istack;
TreeNode *p = root;
while(!istack.empty() || p)
{
while(p)
{
Node *tmpNode = new Node();
tmpNode->treeNode = p;
tmpNode->isFirst = true;
istack.push(tmpNode);
p = p->left;
}
if(!istack.empty())
{
Node *node = istack.top();
istack.pop();
if(node->isFirst)//第一次出栈,
{
node->isFirst = false;
istack.push(node);
p = node->treeNode->right;
}
else//表示其右孩子都已经访问了,可以访问当前节点了
{
ivec.push_back(node->treeNode->val);
}
} } }
return ivec; }
};
int main(void)
{
TreeNode *root = new TreeNode();
addNode(root, );
addNode(root, );
addNode(root, );
addNode(root, );
printTree(root);
cout<<endl; Solution solution;
vector<int> v = solution.postorderTraversal(root);
vector<int>::iterator iter;
for(iter = v.begin(); iter != v.end(); ++iter)
cout<<*iter<<" ";
cout<<endl; return ;
}

最新文章

  1. JSHint Options 翻译
  2. codeforces B. Pasha and String(贪心)
  3. Hibernate SQL Dialect 方言
  4. dubbo配置文件报错解决思路
  5. 转载 ACM训练计划
  6. Myeclipse2014破解激活
  7. 最短路 HDU 2544
  8. Git 解决同步 No value for key branch.master.merge found in
  9. JS表格分页(封装版)
  10. Axure实现多用户注册验证
  11. haproxy+keepalived(涵盖了lvs,nginx.haproxy比较)
  12. 从Tomcat的处理web请求分析Java的内存模型
  13. linux command wrap
  14. 协程的NullReferenceException 错误
  15. 【小程序】&amp;nbsp; 的识别
  16. soj2012.King(有向图+蛋疼得一逼)
  17. 腾讯云Ubuntu挂载硬盘空间
  18. sublime text3 常用插件
  19. java之静态方法,静态变量
  20. 2013夏,iDempiere来了 - v1.0c Installers (Devina LTS Release) 2013-06-27

热门文章

  1. 运算符重载(C++)
  2. MySQL优化update操作
  3. Oracle完全卸载
  4. 每天学一点儿HTML5的新标签
  5. ArrayList与LinkedList的基本添加删除方法 模拟栈 队列
  6. Broadcast总结 service
  7. 将对象转为json,加入到HttpResponseMessage中
  8. Macbook pro睡眠状态恢复后没声音的解决办法
  9. 无法启动MYSQL服务”1067 进程意外终止”解决的方法——汇总及终极方法
  10. 将Win7笔记本设置成WiFi热点(无线路由器)