题解
如果是刚做过 144. preorder traversal 的题,这道题不难延伸,虽然这是一道“hard”题。
postorder是“left ==> right ==> root”的遍历顺序,还是应用栈(stack)的数据结构,由于树的遍历必须是自上而下,也就是root必须在前面,不妨把问题转换乘“root ==> right ==> left”的顺序遍历,应用类似 144. preoder 的方法,就容易得到一个以这个顺序遍历的数据vector。只是要记得在函数返回前将这个vector倒序,这样就使得顺序变回原来的要求。
如果过程想象不清楚的话,画图手动实现一个例子是个比较好的方法去检验。
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ret;
stack<TreeNode*> s;
if(!root) return ret;
s.push(root);
while(!s.empty()) {
TreeNode* n = s.top();
s.pop();
ret.push_back(n->val);
if(n->left) s.push(n->left);
if(n->right) s.push(n->right);
}
reverse(ret.begin(), ret.end());
return ret;
}
};