您的位置:首页 > 其它

LeetCode:Binary Tree Postorder

2014-08-29 14:45 211 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息