本題要求實現函數,判斷給定二叉樹是否二叉搜索樹。
函數接口定義:
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:如下圖
輸出樣例1:
Yes
輸入樣例2:如下圖
輸出樣例2:
No
中序遍歷,判斷結點是否比左子樹中的最大值還大,如果是則滿足,否則不滿足。空樹特殊情況。
代碼:
bool IsBST ( BinTree T ) { if(T == NULL) return true; if(T -> Left && !IsBST (T -> Left)) return false; BinTree p = T -> Left; if(p) { while(p -> Right) p = p -> Right; if(T -> Data < p -> Data) return false; } if(T -> Right) return IsBST(T -> Right); else return true; }