请实现一个函数,打印给定二叉树的中序遍历序列并判定他是否是一棵二叉搜索树(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; } /* 你的代码将被嵌在这里 */
时间: 2023-06-16 16:04:56 浏览: 195
```
#include <stdio.h>
#include <stdlib.h>
#include <limits.h> // 用于 INT_MAX 和 INT_MIN 的定义
struct BinTree{
int data;
struct BinTree* left;
struct BinTree* right;
};
struct BinTree* createNode(int item){
struct BinTree* newNode = (struct BinTree*)malloc(sizeof(struct BinTree));
newNode->data = item;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
void inorderTraversal(struct BinTree* root){ // 中序遍历
if(root == NULL) return;
inorderTraversal(root->left);
printf("%d\n", root->data);
inorderTraversal(root->right);
}
int isBSTUtil(struct BinTree* root, int minVal, int maxVal){ // 判断是否为二叉搜索树的辅助函数
if(root == NULL) return 1;
if(root->data < minVal || root->data > maxVal) return 0; // 判断当前结点是否符合二叉搜索树的定义
return isBSTUtil(root->left, minVal, root->data - 1) && isBSTUtil(root->right, root->data + 1, maxVal); // 递归判断左右子树
}
int isBST(struct BinTree* bt){
return isBSTUtil(bt, INT_MIN, INT_MAX);
}
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* findNode(struct BinTree* bt, int item){
if(bt == NULL) return NULL;
if(bt->data == item) return bt;
struct BinTree* leftNode = findNode(bt->left, item);
if(leftNode) return leftNode;
struct BinTree* rightNode = findNode(bt->right, item);
return rightNode;
}
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 main(){
struct BinTree* bt;
bt = createBinTree();
inorderTraversal(bt); // 中序遍历并打印
printf("%s\n", isBST(bt) ? "Yes" : "No" );
return 0;
}
```
阅读全文