判断一棵二叉树是否为二叉搜索树(二叉排序树)的三种方法
二叉搜索树性质:
1.左子树的节点值<根节点值;
2.右子树的节点值>根节点值;
3.二叉搜索树的中序遍历序列为单调递增序列
根据以上性质可以总结出以下方法:
方法一:如果左子树节点的最大值<根节点的值,右子树节点的最小值大于根节点,则一定为二叉搜索树
方法二:中序遍历二叉树,若遍历结果序列单调递增,一定为二叉搜索树
方法一具体代码如下:
二叉树定义:
struct BiNode
{
int dada;
BiNode *lchild;
BiNode *rchild;
};
递归找最大值:
int Find_max(BiNode *root)///找最大值
{
int maxm=root->data;
if(root->lchild!=NULL)
{
int maxleft=Find_max(root->lchild);
maxm=max(maxm,maxleft);
}
if(root->rchild!=NULL)
{
int maxright=Find_max(root->rchild);
maxm=max(maxm,maxright);
}
return maxm;
}
递归找最小值:
int Find_min(BiNode *root)///找最小值
{
int minn=root->data;
if(root->lchild!=NULL)
{
int minleft=Find_min(root->lchild);
minn=min(minn,minleft);
}
if(root->rchild!=NULL)
{
int minright=Find_min(root->rchild);
minn=min(minn,minnright);
}
return minn;
}
判断函数:
int ISBST(BiNode *root)
{
if(root==NULL)
return 1;
if(root->lchild!=NULL && Find_max(root->lchild) > root->data)///如果左子树最大值大于根节点,直接return
return 0;
if(root->rchild!=NULL && Find_min(root->rchild) < root->data)///如果右子树的最小值小于根节点,直接return
return 0;
if(ISBST(root->lchild) && ISBST(root->rchild))///左子树和右子树都符合二叉搜索树的性质的二叉树才是二叉搜素树
return 1;
}
方法二:
将二叉树的中序遍历结果保存在数组中,判断数组中的元素是否单调递增即可
void inorder(BiNode *root)
{
if(root==NULL)
return;
if(root->lchild!=NULL)
inorder(root->lchild);
temp[k++]=root->data;
if(root->rchild!=NULL)
inorder(root->rchild);
}
void ISBST()
{
int flag=0;
for(int i=1; i<k; i++)
if(temp[i]<temp[i-1])
return 0;
return 1;
}
方法三:方法二的改进:开辟数组占空间复杂度,所以设置一个前驱节点,每次只需与前驱节点比较即可
int ISBST(BiNode *root)
{
BiNode *pre;
if(root!=NULL)
{
if(!ISBST(root->lchild))
return 0;
if(pre!=NULL && root->data <pre->data)
return 0;
pre=root;
if(!ISBST(root->rchild))
return 0;
}
return 1;
}