问题:
Given a binary tree, return the postorder traversal of its nodes' values.
Example:
Input:[1,null,2,3]
1 \ 2 / 3 Output:[3,2,1]
Follow up: Recursive solution is trivial, could you do it iteratively?
分析:
有了leetcode question 144的经验之后,考虑到后序查找有着子节点比父节点早访问到的特性,这道题如果是迭代的话还是需要stack来完成。这里什么时候弹出有一个比较巧妙的做法,就是当该节点的左子节点和右子节点进入堆后,就将该节点的左右两个子节点置为空值。然后当节点两个子节点都为空时,才弹出该节点。这样处理可以避免了很多繁杂的操作。
代码:
/**
* 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) {
stack<TreeNode*> nodes;
vector<int> nums;
if( root == NULL ){
return nums;
}
nodes.push(root);
while( !nodes.empty() ){
TreeNode* curNode = nodes.top();
//左右皆为空的时候就可以弹出了
if( curNode->left == NULL && curNode->right == NULL ){
nodes.pop();
nums.push_back(curNode->val);
}
//推入堆后要置为空
if( curNode->right != NULL ){
nodes.push(curNode->right);
curNode->right = NULL;
}
if( curNode->left != NULL ){
nodes.push(curNode->left);
curNode->left = NULL;
}
}
return nums;
}
};