判斷是否是二叉搜尋樹
阿新 • • 發佈:2018-11-24
6-21 是否二叉搜尋樹 (25 分)
本題要求實現函式,判斷給定二叉樹是否二叉搜尋樹。
函式介面定義:
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
程式碼:只要滿足二叉樹的性質
- 非空左子樹的所有鍵值小於其根結點的鍵值。
- 非空右子樹的所有鍵值大於其根結點的鍵值。
#include<stdio.h> #include<stdlib.h> typedef struct node* BinTree; struct node{ int Data; BinTree left,right; }; BinTree CreatTree(); int FindLeftMaxValue(BinTree T); int FindRightMinValue(BinTree T); bool IsBST(BinTree T); int main() { BinTree T=CreatTree(); if(IsBST(T)) printf("YES\n"); else printf("NO\n"); return 0; } BinTree CreatTree() { BinTree T; int data; scanf("%d",&data); if(data==-1) T=NULL; else { T=(BinTree)malloc(sizeof(struct node)); T->Data=data; T->left=T->right=NULL; T->left=CreatTree(); T->right=CreatTree(); } return T; } bool IsBST(BinTree T) { if(T==NULL) return true; if(T->left && FindLeftMaxValue(T->left)>T->Data) return false; if(T->right && FindRightMinValue(T->right)<T->Data) return false; if(!IsBST(T->left) || !IsBST(T->right)) return false; //都滿足,是二叉樹 return true; } FindLeftMaxValue(BinTree T) { int max; max=T->Data; BinTree p; p=T->right; while(p) { if(max<p->Data) max=p->Data; p=p->right; } return max; } FindRightMinValue(BinTree T) { int min; min=T->Data; BinTree p; p=T->left; while(p) { if(min>p->Data) min=p->Data; p=p->left; } return min; }