错误思路:通过判断p->lchild->data <= p->data <= p->rchild->data 是否成立
错误原因: 只能确定一个最小单位的二叉树是否为排序二叉树,而不能确保所有左(右)子树节点都小(大)于根节点
举最简单的例子:下面这样符合判断 条件,但不是二叉排序树
抛开其逻辑错误不说,
分析一下实现代码:(摘自其它博客)
bool Judge(PBinTree pbt)
{
PBinTreeNode pLeft, pRight;
bool bLeft = false, bRight=false, bRootl=false, bRootr=false;
if(pbt == NULL)
return true;
// 判断根节点
pLeft = pbt->left;
pRight = pbt->right;
if((pLeft && pLeft->data <= pbt->data)||pLeft==NULL)
{
bRootl = true;
}
if((pRight && pRight->data >= pbt->data)||pRight==NULL)
{
bRootr = true;
}
// 判断左右子树
bLeft = Judge(pLeft);
bRight = Judge(pRight);
// 同时满足条件才叫二叉排序树
return( bLeft && bRight && bRootl && bRootr);
}
一开始觉得定义四个标志变量是多余,但自己试着实现后发现是必须的,
首先:若只有bRootl,bRootr,那么之后的递归相当于没有做,因为没有保留结果
其次:(仅是自我理解)bRootl,bRootr标志相当于针对当前根节点而言其左右子树(仅儿子辈)是否符合条件
而bLeft,bRight则是(以此根节点的)左(右)子树作为新树的根节点而言,是否符合条件。
正确思路:中序遍历输出时,前驱节点一定比后继节点小
(摘自其他博客)
int last=0,flag=1;
int Is_BSTree(Bitree T)//判断二叉树T是否二叉排序树,是则返回1,否则返回0
{
if(T->lchild&&flag) Is_BSTree(T->lchild);
if(T->data<last) flag=0; //与其中序前驱相比较
last=T->data;
if(T->rchild&&flag) Is_BSTree(T->rchild);
return flag;
}