天天看點

習題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;
        }
    }
}
           

繼續閱讀