1. 题目描述
2. 思路分析
后序 : 左 – 右 – 根
思路和前序中序大体一致, 只是多了一个右子树是否访问的判断
下面给出前序和中序的以供参考
这里要注意的是, 获取栈顶结点的时候必须要创建新的结点, 不能拿cur直接获取
否则会陷入无限递归
如果是拿cur获取栈顶元素并进行操作, 那么每次进入循环都会找最左路径, 无限的执行相同的逻辑
3. 代码展示
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> ret;
TreeNode* cur = root;
TreeNode* prev = nullptr; //保存上一个访问的结点, 用于判断右子树是否访问
while(cur || !st.empty()) {
//走最左路径
while(cur) {
st.push(cur);
cur = cur->left;
}
//走完最左路径, 要向上返回, 拿到栈顶元素
TreeNode* top = st.top();
//判断当前结点的右子树是否已经访问
if(top->right == nullptr ||top->right == prev) {
//当前元素没有右孩子 或者 右孩子就是刚刚访问的结点
//保存当前结点的值
ret.push_back(top->val);
st.pop();
//记录当前访问的结点
prev = top;
}
else {
//当前结点还有右孩子没有访问
cur = top->right;
}
}
return ret;
}
};