本文最后更新于1937天前,其中的信息可能已经有所发展或是发生改变。
本题要求实现函数,判断给定二叉树是否二叉搜索树。
函数接口定义:
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)||(!T->Left)&&(!T->Right)) return true; else{ BinTree TLeft, TRight; if(T->Left){ TLeft = T->Left; while(TLeft->Right) TLeft = TLeft->Right;//找该点左子树最大值 } if(T->Right){ TRight = T->Right; while(TRight->Left) TRight= TRight->Left;//找该点右子树最大值 } return (T->Left?(T->Data>TLeft->Data):1)&&(T->Right?(T->Data<TRight->Data):1); } }
第二种
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; }
点击数:370