问题描述:
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?
分析:后序遍历要比先序遍历复杂一些,因为先序遍历是先输出根节点,然后将左右节点入栈就好,而后序遍历是等左右节点输出后才输出根节点。
那我们换个思路想,最先输出和最后输出没啥本质区别对吧,所以,这里我们有两个栈,一个主栈一个从栈,在主栈压栈时先压左栈再压右栈,然后弹栈的时候将根弹到从栈中,这样最后res中直接从从栈一步一步弹出即可。
代码如下:0ms
/**
* 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*> master;
stack<TreeNode*> slave;
if(root)
master.push(root);
while(!master.empty()){
TreeNode *top = master.top();
master.pop();
slave.push(top);
if(top->left)
master.push(top->left);
if(top->right)
master.push(top->right);
}
while(!slave.empty()){
TreeNode *top = slave.top();
slave.pop();
res.push_back(top->val);
}
return res;
}
};