方法一:先遍历根,在遍历所有的左子树,最后在遍历所有的右子树(不是前序遍历)
返回0则不是二叉排序数
int IsBST(BitTree T) //返回1表示为二叉排序树,返回0表示不是
{int flag1=0,flag2=0;
if(T->lchild!=NULL)
{
flag1=1;
if(T->lchild->data > T->data) return 0;
}
if(T->rchild!=NULL)
{
flag2=1;
if(T->rchild->data < T->data) return 0;
}
if(flag1==1 && IsBST(T->lchild)==0) return 0; //这里flag1的作用是防止无限遍历左子树,flag2同理
if(flag2==1 && IsBST(T->rchild)==0) return 0;
return 1;
}
方法二:中序遍历,看是否从小到大排序,用flag记录值,如果值为1则是二叉排序树,反之则否
int minnum = -32768,flag = 1;
typedef struct node{
int data;
struct node *lchild,*rchild;
}bitreer;
void inorder(bitree *bt)
{
if(bt!=0){
inorder(bt->lchild);
if(minnum>bt->data)
flag = 0;
minnum = bt->data;
inorder(bt->rchild);
}
}
注:第二个方法有个坏处,需要遍历完整个二叉树才能的值是否是二叉排序树