C语言运行试写一个判别给定二叉树是否为二叉排序树的算法。以前序遍历序列和中序遍历序列给出该二叉树的结点,并创建该二叉树。然后再进行判断。请注意,树中结点关键字可能相同。 【样例输入1】 6 4 5 8 6 9 0 4 5 6 6 8 9 0 【样例输出1】 true 【样例输入2】 6 4 7 8 0 4 7 6 8 0 【样例输出2】 false
时间: 2023-12-30 21:04:12 浏览: 101
下面是 C 语言的代码实现,首先根据前序遍历和中序遍历构建出二叉树,然后通过中序遍历的结果判断是否为二叉排序树:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
int pre_order[MAXN]; // 存储前序遍历序列
int in_order[MAXN]; // 存储中序遍历序列
int n; // 树的结点个数
int pos; // 全局变量,记录当前在中序遍历序列中处理到的位置
TreeNode *build_tree(int pre_l, int pre_r, int in_l, int in_r) {
if (pre_l > pre_r) {
return NULL;
}
TreeNode *root = (TreeNode *) malloc(sizeof(TreeNode));
root->val = pre_order[pre_l];
int k;
for (k = in_l; k <= in_r; k++) {
if (in_order[k] == root->val) {
break;
}
}
int num_left = k - in_l;
root->left = build_tree(pre_l + 1, pre_l + num_left, in_l, k - 1);
root->right = build_tree(pre_l + num_left + 1, pre_r, k + 1, in_r);
return root;
}
int is_bst(TreeNode *root, int min_val, int max_val) {
if (root == NULL) {
return 1;
}
if (root->val < min_val || root->val > max_val) {
return 0;
}
return is_bst(root->left, min_val, root->val - 1) && is_bst(root->right, root->val + 1, max_val);
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &pre_order[i]);
}
for (int i = 0; i < n; i++) {
scanf("%d", &in_order[i]);
}
TreeNode *root = build_tree(0, n - 1, 0, n - 1);
if (is_bst(root, -2147483648, 2147483647)) {
printf("true\n");
} else {
printf("false\n");
}
return 0;
}
```
阅读全文