输入一棵二叉树,判读是否为二叉搜索树,c语言实现
时间: 2023-11-02 17:26:37 浏览: 91
好的,以下是C语言实现:
```c
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define MAX_N 10000 // 二叉树结点最大个数
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
int idx = 0; // 当前二叉树结点的下标
int arr[MAX_N]; // 用于保存中序遍历的结果
// 二叉树的中序遍历
void inorder(struct TreeNode* root) {
if(root == NULL) return;
inorder(root->left); // 左子树
arr[idx++] = root->val; // 根结点
inorder(root->right); // 右子树
}
// 判断数组是否是升序排列
bool isAscending(int* arr, int size) {
for(int i = 1; i < size; i++) {
if(arr[i] <= arr[i-1]) {
return false;
}
}
return true;
}
// 判断二叉树是否为二叉搜索树
bool isValidBST(struct TreeNode* root) {
idx = 0; // 每次运行函数前重置全局变量
inorder(root); // 中序遍历二叉树
return isAscending(arr, idx); // 判断结果数组是否升序排列
}
int main() {
// 测试用例
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val = 5;
root->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->left->val = 1;
root->left->left = NULL;
root->left->right = NULL;
root->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->right->val = 4;
root->right->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->right->left->val = 3;
root->right->left->left = NULL;
root->right->left->right = NULL;
root->right->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->right->right->val = 6;
root->right->right->left = NULL;
root->right->right->right = NULL;
bool result = isValidBST(root);
printf("%s\n", result ? "true" : "false");
return 0;
}
```
上述代码通过中序遍历二叉树得到一个有序数组,然后判断该数组是否为升序排列,如果是,则该二叉树为二叉搜索树,否则不是。
阅读全文