应用题 24.请编写一个判别给定二叉树是否为二叉排序树的算法,设二叉树用llink—rlink法存储。
【正确答案】 根据二叉排序树中序遍历所得结点值为增序的性质,在遍历中将当前遍历结点与其前驱结点值比较,即可得出结论,为此设全局指针变量pre(初值为null)和全局变量flag,初值为true。若非二叉排序树,则置flag为false。
#define true 1
#define false 0
typedef struct node{
datatype data;
struct node*llink,*rlink:
}*BTree;
void JudgeBST(BTree t,int flag){
//判断二叉树是否是二叉排序树,本算法结束后,在调用程序中由flag得出结论
if(t!=null&&flag){
JudgeBST(t一>llink,flag); //中序遍历左子树
if(pre==null)pre=t; //中序遍历的第一个结点不必判断
else if(pre一>data<t一>>data)pre=t; //前驱指针指向当前结点
else flag=false; //不是二叉排序树
JudgeBST(t一>rlink,flag); //中序遍历右子树
}
}
本题的另一算法是依照定义,二叉排序树的左右子树都是二叉排序树,根结点的值大于左子树中所有值而小于右子树中所有值,即根结点大于左子树的最大值而小于右子树的最小值。算法如下:
int JudgeBST(BTree t){
//判断二叉树t是否是二叉排序树,若是,返回true,否则,返回false
if(t==null)return true:
if(JudgeBST(t一>llink)&&JudgeBST(t一>rlink)){ //若左右子树均为二叉排序树
m=max(t一>llink);n=min(t一>rlink); //左子树中最大值和右子树中最小值
return(t一>data>m&&t一>data<n);
}
else return false; //不是二叉排序树
}
int max(BTree p){ //求二叉树左子树的最大值
if(p==null)return—maxint; //返回机器最小整数
else{
while(p一>rlink!=null)P=p一>rlink;
return p一>data;
}
}
int min(BTree p){ //求二叉树右子树的最小值
if(P==null)return maxint; //返回机器最大整数
else{
while(p一>llink !=null)p=p一>rlink;
return p一>data;
}
}
【答案解析】