考研数据结构(每日一题)
题目:后序遍历的非递归算法
算法思想:
沿着根的左孩子依次入栈,直到左孩子为空
读栈顶元素(判定),若其右孩子不空且未被访问,将右子树执行第一步
栈顶元素出栈
入栈向左一直走,判定(右子树),出栈访问,标记,重置
完整代码:
void PostOrder(BiTree T){
InitStack(S);
p = T;
r = NULL;
while (p || !IsEmpty(S))
{
if (p) //走在最左边
{
push(S,p);
p = p -> lchild;
}
else //向右
{
GetTop(S,p); //读栈顶结点(非出栈)
if (p -> rchild && p-> rchild != r) //若右子树存在,且未被访问过
{
p = p -> rchild; //向右
}
else //否则,弹出结点并访问
{
pop(S,p); //将结点弹出
visit(p -> data); //访问该结点
r = p; //记录最近访问过的结点
p = NULL; //结点访问完后,重置p指针
}
}
}
}