思路:跟前序遍历的非递归类似。请参考前序遍历的注释。唯一不同的地方是在输出值的位置不一样
/**
* Definition for a binary tree node.* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
struct DataNode{
TreeNode *node;
int state;
DataNode(TreeNode *p=NULL,int x=0):node(p),state(x){}
};
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
if(root==NULL) return vector<int>();
vector<int> result;
stack<DataNode> tree_stack;
DataNode data_node(root,0);
tree_stack.push(data_node);
while(!tree_stack.empty()){
DataNode tem_data=tree_stack.top();
tree_stack.pop();
if(tem_data.state==0){
if(tem_data.node!=NULL){
tem_data.state=1;
tree_stack.push(tem_data);
tree_stack.push(DataNode(tem_data.node->left,0));
}
}else if(tem_data.state==1){
tem_data.state=2;
tree_stack.push(tem_data);
tree_stack.push(DataNode(tem_data.node->right,0));
}else if(tem_data.state==2){
result.push_back(tem_data.node->val);//后序遍历的输出值放在这个位置。
}
}
return result;
}
};