用C语言试写一算法判别给定的二叉树是否为二叉排序树,设此二叉树以二叉链表存储,且树中结点的关键字均不相同,写出完整代码程序,并在程序里面写出注释。要求让用户自行输入数据生成二叉树,并完成判断
时间: 2025-01-06 12:52:48 浏览: 6
为了编写一个C语言函数来判断一个二叉树是否为二叉排序树(BST),我们可以采用递归的方式来遍历并比较节点的值。这里是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
typedef struct TreeNode {
int key; // 节点的键值
struct TreeNode *left; // 左子树指针
struct TreeNode *right; // 右子树指针
} TreeNode;
// 判断给定节点是否满足BST条件
int isBSTHelper(TreeNode* node, int minVal, int maxVal) {
if (node == NULL) return 1; // 空节点视为满足BST
// 如果当前节点的值小于最小值或者大于最大值,则不符合BST条件
if (node->key < minVal || node->key > maxVal)
return 0;
// 递归检查左子树和右子树
if (!isBSTHelper(node->left, minVal, node->key - 1)) // 验证左子树
return 0;
if (!isBSTHelper(node->right, node->key + 1, maxVal)) // 验证右子树
return 0;
return 1;
}
// 主函数,用户输入创建并验证BST
void checkBST(int n) {
TreeNode* root = NULL; // 根节点初始化为NULL
for (int i = 0; i < n; ++i) { // 用户输入n个节点
int key;
printf("请输入第 %d 个节点的值: ", i + 1);
scanf("%d", &key);
// 创建新节点并将它插入到已有的二叉树中
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->key = key;
newNode->left = newNode->right = NULL;
// 如果根节点为空,直接设置为新节点
if (root == NULL)
root = newNode;
else { // 否则,按BST规则插入
TreeNode* current = root;
while (1) {
if (key < current->key) {
if (current->left == NULL)
break;
current = current->left;
} else {
if (current->right == NULL)
break;
current = current->right;
}
}
newNode->left = current->left; // 将新节点插入适当位置
current->left = newNode;
}
}
// 检查整个二叉树是否为BST
if (isBSTHelper(root, INT_MIN, INT_MAX))
printf("输入的二叉树是有序的(BST)。\n");
else
printf("输入的二叉树不是有序的。\n");
}
int main() {
int numNodes;
printf("请输入二叉树的节点数: ");
scanf("%d", &numNodes);
checkBST(numNodes);
return 0;
}
```
在这个代码中,用户首先输入节点数量,然后逐个输入节点值,程序会动态构建二叉树并在构建过程中维护其排序特性。最后,`checkBST` 函数通过 `isBSTHelper` 递归地检查整个树是否满足BST的条件。
阅读全文