天天看点

习题4.3 是否二叉搜索树 (25 分)+C语言

本题要求实现函数,判断给定二叉树是否二叉搜索树。

函数接口定义:

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;
}
/* 你的代码将被嵌在这里 */
           

输入样例1:如下图

习题4.3 是否二叉搜索树 (25 分)+C语言

输出样例1:

Yes
           

输入样例2:如下图

习题4.3 是否二叉搜索树 (25 分)+C语言

输出样例2:

No
           

参考答案:

ElementType FindMin(BinTree T)//寻找右子树最小值
{
    while(T->Left!=NULL)
    T=T->Left;
    return T->Data;
}
ElementType FindMax(BinTree T)//寻找左子树最大值
{
    while(T->Right!=NULL)
    T=T->Right;
    return T->Data;
}
bool IsBST ( BinTree T )
{
    if(T==NULL)
    {
        return true;
    }
    else
    {
        int LeftMax,RightMin;
        if(T->Left==NULL)
            LeftMax=T->Data-1;//便于比较,设置虚拟哨兵
        else
            LeftMax=FindMax(T->Left);
        if(T->Right==NULL)
            RightMin=T->Data+1;//同理
        else
            RightMin=FindMin(T->Right);
        if(IsBST(T->Left)&&IsBST(T->Right)&&(LeftMax<T->Data)&&(RightMin>T->Data))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}
           

继续阅读