题目大意:求二叉树的后序遍历的非递归
二叉树的递归后序遍历很容易实现,现在我们需要模拟递归时的堆栈。
一个节点输出,需要它的左右子树都遍历完时,才能输出。
所以我们需要一个辅助的标记位flag来表示当前节点的左右子树是否遍历完毕。
新加入栈的点的flag为0,初始的时候将根节点root加入栈,设置flag为0
而后判断栈是否为空,为空就结束,不为空则按下面的条件处理:
1.当栈顶元素的flag为2时,说明当前节点左右子树都遍历完毕,则弹出这个节点并输出。
2.当栈顶元素的flag为0时,说明它的左子树没有遍历,则将当前这个节点的flag至为1,如果左子树不为空,则将左子树的根节点加入栈并设置其flag为0
3.当栈顶元素的flag为1时,说明它的左子树遍历完,右子树没有遍历完,则将当前这个节点的flag设置为2,如果右子树不为空,则将左子树的根节点加入栈并设置其flag为0
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x): val(x), left(NULL), right(NULL) {}
};
struct WrapTreeNode {
TreeNode *node;
int flag;
WrapTreeNode(TreeNode *item, int f): node(item), flag(f) {}
};
class Solution {
public:
vector<int> postorderTraversal(TreeNode *root) {
vector<int> result;
if(root == NULL)
return result;
vector<WrapTreeNode *> st;
WrapTreeNode *wrap_root = new WrapTreeNode(root, 0);
st.push_back(wrap_root);
while(!st.empty()) {
WrapTreeNode *item = st.back();
TreeNode *node = item->node;
if(item->flag == 2) {
result.push_back(node->val);
st.pop_back();
delete item;
item = NULL;
} else if(item->flag == 0) {
item->flag = 1;
if(node->left != NULL) {
WrapTreeNode *tmp = new WrapTreeNode(node->left, 0);
st.push_back(tmp);
}
} else {
item->flag = 2;
if(node->right != NULL) {
WrapTreeNode *tmp = new WrapTreeNode(node->right, 0);
st.push_back(tmp);
}
}
}
return result;
}
};
另一种解法
/**
* 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) {
stack<TreeNode *> poststack;
vector<int> result;
if(root == NULL) {
return result;
}
TreeNode *curNode = root, *preNode = NULL;
do {
while(curNode != NULL) {
poststack.push(curNode);
curNode = curNode->left;
}
if(!poststack.empty()) {
TreeNode *node = poststack.top();
if(node->right == preNode || node->right == NULL) {
result.push_back(node->val);
preNode = node;
poststack.pop();
curNode = NULL;
} else if(node->right != NULL) {
curNode = node->right;
}
}
} while(!poststack.empty());
return result;
}
};