判断二叉树是不是二叉排序,用c语言学
时间: 2024-02-03 17:13:45 浏览: 68
要判断一棵二叉树是否是二叉搜索树(二叉排序树),需要满足以下条件:
1. 如果当前节点有左子树,那么左子树中的所有节点都小于当前节点的值;
2. 如果当前节点有右子树,那么右子树中的所有节点都大于当前节点的值;
3. 左右子树也分别是二叉搜索树。
下面是一个简单的 C 语言代码实现:
```
#include <stdio.h>
#include <stdbool.h>
// 定义二叉树结构体
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 检查当前节点是否符合二叉搜索树的定义
bool isValidBSTHelper(TreeNode* root, long long min, long long max) {
if (root == NULL) {
return true;
}
if (root->val <= min || root->val >= max) {
return false;
}
return isValidBSTHelper(root->left, min, root->val) && isValidBSTHelper(root->right, root->val, max);
}
// 判断是否是二叉搜索树
bool isValidBST(TreeNode* root) {
return isValidBSTHelper(root, (long long)INT_MIN - 1, (long long)INT_MAX + 1);
}
int main() {
// 测试代码
TreeNode* root = malloc(sizeof(TreeNode));
root->val = 5;
root->left = malloc(sizeof(TreeNode));
root->left->val = 1;
root->left->left = NULL;
root->left->right = NULL;
root->right = malloc(sizeof(TreeNode));
root->right->val = 4;
root->right->left = malloc(sizeof(TreeNode));
root->right->left->val = 3;
root->right->left->left = NULL;
root->right->left->right = NULL;
root->right->right = malloc(sizeof(TreeNode));
root->right->right->val = 6;
root->right->right->left = NULL;
root->right->right->right = NULL;
bool result = isValidBST(root);
printf("The tree is %s a binary search tree.", result ? "" : "not");
return 0;
}
```
以上代码中,`isValidBSTHelper` 函数用于判断当前节点是否符合二叉搜索树的定义,它需要传入当前节点、当前节点的最小值和最大值。在判断当前节点的值是否合法时,因为输入数据可能包含 `INT_MIN` 或 `INT_MAX`,所以要将最小值和最大值设为比 `INT_MIN` 和 `INT_MAX` 更小和更大的数。最后,`isValidBST` 函数调用 `isValidBSTHelper` 检查根节点是否符合二叉搜索树的定义。
阅读全文