Given a binary tree, return the postorder traversal of its nodes' values.
1 \ 2 / 3
return [3,2,1].
Note: Recursive solution is trivial, could you do it iteratively?
方法一:用一个map标记当前节点是否被遍历,从而确定是否应该被输出
vector<int> postorderTraversal(TreeNode *root)
{
<span style="white-space:pre"> </span> vector<int> result;
<span style="white-space:pre"> </span> if(root == NULL)
<span style="white-space:pre"> </span> return result;
<span style="white-space:pre"> </span> stack<TreeNode*> stn;
<span style="white-space:pre"> </span> stn.push(root);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span> TreeNode* p = NULL;
<span style="white-space:pre"> </span> map<TreeNode*,bool> jugeMap;
<span style="white-space:pre"> </span> jugeMap.insert(make_pair(root,false));
<span style="white-space:pre"> </span> while(!stn.empty())
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> p = stn.top();
<span style="white-space:pre"> </span> if(p->left!=NULL && jugeMap.find(p->left) == jugeMap.end())
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> stn.push(p->left);
<span style="white-space:pre"> </span> jugeMap.insert(make_pair(p->left,false));
<span style="white-space:pre"> </span> continue;
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> if(p->right!=NULL && jugeMap.find(p->right) == jugeMap.end())
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> stn.push(p->right);
<span style="white-space:pre"> </span> jugeMap.insert(make_pair(p->right,false));
<span style="white-space:pre"> </span> continue;
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> result.push_back(p->val);
<span style="white-space:pre"> </span> stn.pop();
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> return result;
}
已AC 8ms
方法二:用一个指针跟踪上次访问的节点,如果当前节点的左子女或右子女是上次访问节点的话,当前节点输出,更新上次访问节点指针
vector<int> postorderTraversal(TreeNode *root)
{
vector<int> result;
if(root == NULL)
return result;
stack<TreeNode*> stn;
stn.push(root);
TreeNode* current = root;
TreeNode* pre = NULL;
while(!stn.empty())
{
current = stn.top();
if((current ->left == NULL && current -> right == NULL) || ((pre != NULL) && (current -> left == pre || current -> right == pre)))
{
result.push_back(current->val);
stn.pop();
pre = current;
continue;
}
if(current->right!=NULL)
stn.push(current->right);
if(current->left!=NULL)
stn.push(current->left);
}
return result;
}
已AC 8ms