后序遍历:左右中。
思路1:
—————–,1
————–,2
————,3
———-4.
————,5
———-6
设置一个指针。(参考binary search tree iterator)
1)一直往左下找,找到最左下的元素(例如,1-4)。过往的元素入栈。
2)每次到了最左下以后就查看是否有右节点。(例如,4有右节点5)
i 如果有还要继续(从右节点), 返回第一步。(例如5-6)
ii 如果没有,出栈当前元素,记录结果,并且当前元素记为pre。
3)注意,对于2)如果右节点已经是pre了(回溯上来了!)就如ii继续出栈。
时间复杂度:
O(n) 空间复杂度:O(n)
Code (C++):
class Solution {
public:
vector<int> postorderTraversal(TreeNode *root) {
vector<int> res;
if(root == NULL) return res;
stack<TreeNode *> st;
TreeNode *pre = NULL;
while(!st.empty() || root!=NULL)
{
if(root!=NULL)
{
st.push(root);
root = root->left;
}
else
{
TreeNode * topNode = st.top();
if(topNode->right!=NULL && pre!=topNode->right)
{
root = topNode->right;
}
else{
st.pop();
res.push_back(topNode->val);// if pre == topNode, means it is going up. store right.
pre = topNode;
}
}
}
}
};
思路2:
用两个stack来存储。
s2: root,
s1: left, right
在出栈s1的时候,弹到s2中。使得s2中刚好是postorder的顺序。
s2: root(l1), right(root l2), left(root l2)
最终结果就是s2依次弹出栈顶元素的顺序。
时间复杂度:
O(n)遍历一边,空间复杂度:O(n);
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
if(root == NULL) return res;
stack<TreeNode *> stk;
stack<TreeNode *> stk2;
stk.push(root);
while(!stk.empty())
{
TreeNode * cur = stk.top();
stk.pop();
stk2.push(cur);
if(cur->left!=NULL)
{
stk.push(cur->left);
}
if(cur->right!=NULL)
{
stk.push(cur->right);
}
}
while(!stk2.empty())
{
res.push_back(stk2.top()->val);
stk2.pop();
}
return res;
}
};