方法一:
先找最左孩子,只有最左孩子同时是叶子节点,才是目标节点,否则迭代最左孩子的右孩子。
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> vt;
stack<TreeNode*> st;
if(root==NULL)
return vt;
while(root!=NULL||!st.empty())
{
while(root)
{
if(!st.empty()&&st.top()==root)
break;
st.push(root);
root=root->left;
st.top()->left=NULL;
}
if(!st.empty())
{
root=st.top();
if(root->right)
{
root=root->right;
st.top()->right=NULL;
}
else
{
vt.push_back(root->val);
st.pop();
if(!st.empty())
root=st.top();
else
root=NULL;
}
}
}
return vt;
}
};
方法2:后序遍历的顺序是left -right-root;现在的出栈顺序是root ,right,left。将结果翻转即可
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> vt;
stack<TreeNode*> st;
if(!root)
return vt;
st.push(root);
while(!st.empty())
{
root=st.top();
st.pop();
vt.push_back(root->val);
if(root->left)st.push(root->left);
if(root->right)st.push(root->right);
}
reverse(vt.begin(), vt.end());
return vt;
}
};