c语言检测输入的二叉树是否为二叉排序树
时间: 2024-11-05 17:24:32 浏览: 4
写一算法,判断一棵二叉树是否是一棵二叉排序树。
在C语言中,检测一个给定的二叉树是否为二叉排序树(Binary Search Tree,BST),通常需要递归遍历并检查每个节点是否满足BST的性质:左子树的所有节点值都小于当前节点,右子树的所有节点值都大于当前节点。以下是基本的算法步骤:
1. 定义一个函数 `isBST` 或者 `isSortedBST`,它接收两个参数:根节点 `root` 和一个空的指针 `minNode` 和 `maxNode` 来分别表示当前路径上遇到的最小和最大值。
2. 如果根节点为空,则返回 `true`,因为空树是BST的一种特殊情况。
3. 遍历左子树,如果左子节点存在,确保其值小于当前节点,并且调用 `isBST` 函数传入左子节点和更新后的 `maxNode`。
4. 检查当前节点的值是否在 `minNode` 到 `maxNode` 的范围内。如果不是,说明不是BST。
5. 如果当前节点是正确的,继续递归检查右子树,传递相同的 `minNode` 和更新过的 `maxNode`(此时 `maxNode` 应该等于当前节点的值)。
6. 最终返回 `isBST(root, NULL, NULL)`,即整个树是否满足BST的条件。
```c
#include <stdio.h>
#include <stdbool.h>
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
bool isBST(struct TreeNode* root, int* minNode, int* maxNode) {
if (root == NULL) {
return true;
}
if (*minNode != INT_MIN && root->val <= *minNode) {
return false;
}
if (*maxNode != INT_MAX && root->val >= *maxNode) {
return false;
}
*minNode = root->val;
*maxNode = root->val;
bool left = isBST(root->left, minNode, maxNode);
bool right = isBST(root->right, minNode, maxNode);
return left && right;
}
// 示例用法
int main() {
// 假设已经有一个二叉树结构体的指针作为输入
struct TreeNode* tree = ...;
int minVal, maxVal;
if (!isBST(tree, &minVal, &maxVal)) {
printf("这不是一棵二叉排序树。\n");
} else {
printf("这是一个二叉排序树。\n");
}
return 0;
}
```
阅读全文