6-1 是二叉搜索树吗?
作者 周强
单位 青岛大学
请实现一个函数,打印给定二叉树的中序遍历序列并判定他是否是一棵二叉搜索树(Binary Search Tree)。
(提示:空树是二叉搜索树)
函数接口定义:
int isBST(struct BinTree* bt);
其中二叉树定义如下:
struct BinTree{ int data; struct BinTree* left; struct BinTree* right; };
题目保证二叉树不超过200个结点,结点数值在整型int
范围内且各不相同。
函数打印二叉树的中序遍历序列,每个元素占一行。对于空树,函数不打印任何内容。
如果给定的树是二叉搜索树,函数返回1
,否则返回0
。
裁判测试程序样例:
#include "stdio.h" #include "stdlib.h" struct BinTree{ int data; struct BinTree* left; struct BinTree* right; }; struct BinTree* createNode(int item){ // 创建结点 /* 函数实现细节省略 */ } struct BinTree* findNode(struct BinTree* bt, int item){ // 查找结点 /* 函数实现细节省略 */ } int insert(struct BinTree*bt, int parent, int dir, int item){ // 插入结点 /* 实现细节仅供参考 */ struct BinTree* tmp; tmp = findNode(bt, parent); if(!tmp) return 0; if(dir == 0){ if(tmp->left) return 0; tmp->left = createNode(item); if(tmp->left == NULL) return 0; } else{ if(tmp->right) return 0; tmp->right = createNode(item); if(tmp->right == NULL) return 0; } return 1; } struct BinTree* createBinTree(){ // 创建二叉树 /* 实现细节仅供参考 */ int total, data; scanf("%d", &total); if(total == 0) return NULL; scanf("%d", &data); struct BinTree* bt; bt = createNode(data); if(!bt) return NULL; int parent,dir; for(int i=1; i<total; i++){ scanf("%d%d%d",&parent, &dir, &data); insert(bt,parent, dir, data); } return bt; } int isBST(struct BinTree* bt); int main(){ struct BinTree* bt; bt = createBinTree(); printf("%s\n", isBST(bt) ? "Yes" : "No" ); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
对于此图的二叉树及样例测试程序规定的输入格式:
3
20
20 0 10
20 1 25
Sample Output:
10
20
25
Yes
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
int isBST(struct BinTree* bt)
{
int a=1,b=1;
if(bt==NULL)return 1;
if(bt->left)a=isBST(bt->left);
printf("%d\n",bt->data);
if(bt->right)b=isBST(bt->right);
if(bt->left&&bt->left->data>bt->data)a= 0;
if(bt->right&&bt->right->data<bt->data)b= 0;
if(a&&b)
return 1;
else return 0;
}