问答题 请编写一个判别给定二叉树是否为二叉排序树的算法,设二叉树用llink-rlink法存储。【北京大学1998三、2(5分)】【南京大学2000】【苏州大学2004五(15分)】【中国海洋大学2005八(15分)】
【正确答案】正确答案:根据二叉排序树中序遍历所得结点值为增序的性质,在遍历中将当前遍历结点与其前驱结点值比较,即可得出结论。为此设全局指针变量pre(初值为null)和全局变量flag,初值为true。若非二叉排序树,则置flag为false。算法如下: void JudgeBST(BSTree t,int&flag) //判断二叉树是否是二叉排序树,本算法结束后,在调用程序中由flag得出结论 {if(t!=null&&flag) {Judgebst(t一>ichild,flag); //中序遍历左子树 if(pre==null)pre=t; //中序遍历的第一个结点不必判断 else if(pre一>datadata)pre=t; //前驱指针指向当前结点 else flag:false; //不是完全二叉树 Judgebst(t一>rchild,flag); //中序遍历右子树 } }//JudgeBST算法结束 本题的另一算法是按定义,二叉排序树的左、右子树都是二叉排序树,根结点的值大于左子树中所有结点的值而小于右子树中所有结点的值,即根结点大于左子树的最大值而小于右子树的最小值。算法如下: int JudgeBST(BSTree t) //判断二叉树t是否是二叉排序树,若是,返回true,否则,返回false (if(t==null)return true; if(Judgebst(t一>Ichild)&&Judgebst(t一>rchild))//左右子树均为二叉排序树 {m=max(t一>ichild);n=min(t一>rchild); //左子树中最大值和右子树中最小值 return(t一>data>m&&t一>datarchild)p=p->rchild; return P一>data; }//while }
【答案解析】