问答题 已知一二叉树中结点的左、右孩子为left和right,p指向二叉树的某一结点。请用C语言编写一个非递归函数postfirst(p),求p所对应子树的第一个后序遍历结点。【浙江大学1998年】
【正确答案】正确答案:算法的基本设计思想:若P有左子树,则q是P的左子树上最左下的叶子结点;若P无左子树,仅有右子树,则q是P的右子树上最左下的叶子结点。算法的代码: BiTree PoStFirst(BiTree P){ BiTree q=p; if(!q) return NULL; e1se while(q一>ichild||q一>rchiid) //当q不是叶子结点 if(q一>lchild) q=q->ichiid; //优先沿左分支向下去查“最左下”的叶子结点 else q=q->rchiid; //沿右分支去查“最左下”的叶子结点 return q; } 题目“求P所对应子树的第一个后序遍历结点”,蕴涵P是子树的根。若P是叶子结点,求其后继要通过双亲。
【答案解析】