本题要求实现函数,判断给定二叉树是否二叉搜索树。
函数接口定义:
bool IsBST ( BinTree T );
其中BinTree结构定义如下:
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
函数IsBST须判断给定的T是否二叉搜索树,即满足如下定义的二叉树:
定义:一个二叉搜索树是一棵二叉树,它可以为空。如果不为空,它将满足以下性质:
非空左子树的所有键值小于其根结点的键值。
非空右子树的所有键值大于其根结点的键值。
左、右子树都是二叉搜索树。
如果T是二叉搜索树,则函数返回true,否则返回false。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef enum { false, true } bool;
typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
BinTree BuildTree(); /* 由裁判实现,细节不表 */
bool IsBST ( BinTree T );
int main()
{
BinTree T;
T = BuildTree();
if ( IsBST(T) ) printf("Yes\n");
else printf("No\n");
return 0;
}
两种方法:
①按照二叉搜索树的结点可能存在的情况进行分类
bool IsBST ( BinTree T ){
BinTree P = NULL;
if(!T){//如果是空树(空树不含根节点)
return true;
}else if(!T->Left){//左子树是空树
if(!T->Right){//左右子树都是空树
return true;
}else{//左子树是空树,右子树不是空树
P = T->Right;
while(P->Left){//找到右子树中最小结点值所在位置
P = P->Left;
}
if(P->Data <= T->Data){
return false;
}
return IsBST (T->Right);
}
}else{//左子树不是空树
P = T->Left;
while(P->Right){//找到左子树中最大结点值所在位置
P = P->Right;
}
if(P->Data >= T->Data) {
return false;
}
if(!T->Right){//左子树不是空树,右子树是空树
return IsBST (T->Left);
}else{//左右子树都不是空树
P = T->Right;
while(P->Left){//找到右子树中最小结点值所在位置
P = P->Left;
}
if(P->Data <= T->Data){
return false;
}
return (IsBST (T->Left)&&IsBST (T->Right));
}
}
}
②因为二叉搜索树进行中序遍历可以得到一个单调递增的数列,按照这一性质将遍历的结果储存到一个数组中,判断数组是否单调递增
int a[100];
int i = 0;
bool IsBST ( BinTree T )
{
if(T!=NULL){
IsBST(T->Left);
a[i++]=T->Data;
IsBST(T->Right);
}
for(int j = 1;j<i;j++)
if(a[j-1]>=a[j])
return 0;
return 1;
}