问答题 假设二叉树采用链接存储方式存储,编写一个后序遍历二叉树的非递归算法。
【正确答案】根据后序遍历二叉树的递归定义,转换成非递归函数时采用一个栈保存返回的结点,先遍历根结点的所有左结点并入栈,出栈一个结点,然后遍历该结点的右结点并入栈,再遍历该右结点的所有左结点并入栈,当一个结点的左、右子树均访问后再访问该结点,直到栈空为止。其中的难点是如何判断一个结点t的右结点已访问过,为此用p保存已访问过的结点(初值为NULL),若t→right==p成立(在后序遍历中,t的右结点一定是在t之前访问),说明t的左、右子树均已访问,现在应访问t。 实现本题功能的程序代码如下: void psorder(BTNode *t) { BTNode *stack[MaxSize]; BTNode *p; int flag,top=-1; //栈指针置初值 do { while(t) //将t的所有左结点入栈 { ++top; stack[top]=t; t=t→left; } p=NULL; //p指向当前结点的前一个已访问的结点 flag=1; //设置t的访问标记为已访问过 while(top!=-1 && flag) { t=stack[top]; //取出当前的栈顶元素 if(t→right==p) //右子树不存在或已被访问,访问之 { visit(t); //访问t,visit是已定义的函数 --top; p=t; //p指向已被访问的结点 } else { t=t→right; //t指向右子树 flag=0; //设置未被访问的标记 } } }while(top!=-1); }
【答案解析】