确定root非空
设prev指针为空
根入栈
栈非空就一直循环
取栈顶元素到cur,但不出栈
检查该节点是否没有左右孩子,并设标记
检查cur的左右孩子是否与prev相同,确定子节点是否已访问
若没有子节点,或子节点已处理
cur值放入结果中
栈顶元素出栈
将当前值付给prev
否则(还需要处理子节点)
左右逆序压入非空子节点
返回结果
vector<int> postorder(Tree* root) {
vector<int> res;
if (root==NULL) return res; //别忘了判空,只有中序不需要
Tree* prev = NULL;
stack<Tree*> s;
s.push(root);
while (!s.empty()) {
Tree* cur = s.top(); //三个中,唯一一个先看,不pop的情况
bool nochild=false;
if (cur->left == NULL && cur->right == NULL) nochild=true;
bool visited=false;
if (prev && (cur->left == prev || cur->right == prev)) visited=true;
if (nochild || visited) {
res.push_back(cur->val);
s.pop();
prev=cur;
} else {
if (cur->right) s.push(cur->right);
if (cur->left) s.push(cur->left);
}
}
return res;
}