因为我们可以用栈实现前序遍历,所以我们同样可以实现中,右,左的遍历
然后我们每次遍历到了节点不去输出而是添加到另一个栈st2中,最后将st2中的元素一个个的弹出
就得到了后序遍历左,右,中。
参考博客:https://blog.csdn.net/zxzxzx0119/article/details/81744449
附上代码:
/** * 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*> st1; vector<int> res; if(!root) return res; //一个栈用于中,右,左遍历 //另一个用于逆序,我这里直接使用一个vector,然后将其逆序,和栈是同样的作用 st1.push(root); while(!st1.empty()) { TreeNode *cur = st1.top(); res.push_back(cur->val); st1.pop();
//这里先将左子树入栈,与前序遍历相反 if(cur->left) st1.push(cur->left);
//然后将右子树入栈 if(cur->right) st1.push(cur->right); } int i = 0; int j = res.size()-1; while(i < j) { int temp = res[i]; res[i] = res[j]; res[j] = temp; i++;j--; } return res; } };