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?
这个非递归后序遍历二叉树在3种遍历方式里面算是最难的,如果不设置访问标志位,自己也没写出来,最后也是看到了leetcode讨论组的方法才写出来的 觉得这个方法很巧妙,这个方法其实和层次遍历有一点点像,只不过层次遍历中间使用的是队列,后序用栈,具体见 http://leetcode.com/2010/10/binary-tree-post-order-traversal.html
/**
* 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> tmp_v,res;
vector<TreeNode*> m_stack;
TreeNode *tmp = root;
if (root == NULL) return tmp_v;
m_stack.push_back(root);
while (m_stack.size())
{
tmp = m_stack.back();
tmp_v.push_back(tmp->val);
m_stack.pop_back();
if (tmp->left) m_stack.push_back(tmp->left);
if (tmp->right) m_stack.push_back(tmp->right);
}
for (vector<int>::iterator it = tmp_v.end() - 1; it >= tmp_v.begin(); --it)
{
res.push_back(*it);
}
return res;
}
};