继上一篇博文写的先序遍历的递归与循环实现
再写一篇关于二叉树的后序遍历的递归与循环实现。
递归实现简单就不详细说了。
递归实现
void PostOrderVisitR(TreeNode* root, PVisitFun pvisit)
{
if(root == NULL)
return;
PostOrderVisitR(root->plc,pvisit);
PostOrderVisitR(root->prc,pvisit);
pvisit(root);
}
循环实现
由于栈的先进后出,所以将根节点的孩子压栈的时候,先把右孩子压栈,再将左孩子压栈。
如果打开过该节点(获得其左右孩子),就将次节点标记为1。
当发现栈顶元素已经打开过就说名该节点没有左右孩子,将其输出。
void PostOrderVisitI(TreeNode* root, PVisitFun pvisit)
{
stack<TreeNode*> treeStack;
int flag[20];
TreeNode* node = root;
treeStack.push(node);
flag[0] = 0;
while (!treeStack.empty())
{
node = treeStack.top();
if (flag[treeStack.size() - 1] == 1)//为了避免重复将左右孩子压栈。
{
cout<<node->data;
treeStack.pop();
continue;
}
else
flag[treeStack.size() - 1] = 1; //visit the node
if (node->prc != NULL )
{
treeStack.push(node->prc);
flag[treeStack.size() - 1] = 0;//set not visit
}
if (node->plc != NULL )
{
treeStack.push(node->plc);
flag[treeStack.size() - 1] = 0;
}
if (flag[treeStack.size() - 1] == 1)
{
cout<<node->data;
treeStack.pop();
}
}
}