试用c语言写一个判别给定二叉树是否为二叉排序树的递归算法,且设此二叉树以二叉链表作存储结构。且树中节点的关键字均不同
时间: 2024-05-14 08:19:36 浏览: 104
以下是使用 C 语言编写的判断给定二叉树是否为二叉排序树的递归算法:
```c
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
// 二叉树结构体
typedef struct TreeNode {
int data; // 节点的关键字
struct TreeNode *left; // 左子树
struct TreeNode *right; // 右子树
} TreeNode, *Tree;
// 判断给定二叉树是否为二叉排序树
int isBST(Tree tree) {
// 如果二叉树为空,返回 TRUE
if (tree == NULL) {
return TRUE;
}
// 如果左子树不为空且左子树的关键字大于等于当前节点的关键字,返回 FALSE
if (tree->left != NULL && tree->left->data >= tree->data) {
return FALSE;
}
// 如果右子树不为空且右子树的关键字小于等于当前节点的关键字,返回 FALSE
if (tree->right != NULL && tree->right->data <= tree->data) {
return FALSE;
}
// 递归判断左子树和右子树是否为二叉排序树
return isBST(tree->left) && isBST(tree->right);
}
int main() {
// 创建二叉树
Tree tree = (Tree)malloc(sizeof(TreeNode));
tree->data = 8;
tree->left = (Tree)malloc(sizeof(TreeNode));
tree->left->data = 3;
tree->left->left = (Tree)malloc(sizeof(TreeNode));
tree->left->left->data = 1;
tree->left->left->left = NULL;
tree->left->left->right = NULL;
tree->left->right = (Tree)malloc(sizeof(TreeNode));
tree->left->right->data = 6;
tree->left->right->left = (Tree)malloc(sizeof(TreeNode));
tree->left->right->left->data = 4;
tree->left->right->left->left = NULL;
tree->left->right->left->right = (Tree)malloc(sizeof(TreeNode));
tree->left->right->left->right->data = 7;
tree->left->right->left->right->left = NULL;
tree->left->right->left->right->right = NULL;
tree->left->right->right = (Tree)malloc(sizeof(TreeNode));
tree->left->right->right->data = 10;
tree->left->right->right->left = NULL;
tree->left->right->right->right = NULL;
tree->right = (Tree)malloc(sizeof(TreeNode));
tree->right->data = 13;
tree->right->left = NULL;
tree->right->right = (Tree)malloc(sizeof(TreeNode));
tree->right->right->data = 14;
tree->right->right->left = NULL;
tree->right->right->right = NULL;
// 判断二叉树是否为二叉排序树
if (isBST(tree)) {
printf("给定二叉树是二叉排序树\n");
} else {
printf("给定二叉树不是二叉排序树\n");
}
return 0;
}
```
在上面的代码中,我们首先定义了二叉树的结构体 `TreeNode` 和 `Tree`,其中 `TreeNode` 表示二叉树的节点,`Tree` 表示二叉树的指针。然后,我们定义了 `isBST` 函数,用于判断给定二叉树是否为二叉排序树。在该函数中,我们首先判断当前节点的左子树和右子树是否满足二叉排序树的要求,如果不满足,则返回 FALSE,否则递归判断左子树和右子树是否为二叉排序树。最后,在 `main` 函数中,我们创建了一个二叉树,并调用 `isBST` 函数进行判断。如果该二叉树是二叉排序树,则输出“给定二叉树是二叉排序树”,否则输出“给定二叉树不是二叉排序树”。
阅读全文