用C语言设计一个判别给定二叉树是否为二叉排序树的算法
时间: 2024-01-14 14:19:55 浏览: 118
写一算法,判断一棵二叉树是否是一棵二叉排序树。
以下是用C语言设计一个判别给定二叉树是否为二叉排序树的算法:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int data;
struct TreeNode *lchild, *rchild;
} TreeNode, *Tree;
int pre = -32767; // pre为全局变量,保存当前结点中序前驱的值,初始值为-∞
int IsBST(Tree T) {
int left, right; // 保存左右子树的判断结果
if (T == NULL) // 空树也是二叉排序树,返回1
return 1;
else {
left = IsBST(T->lchild); // 判断左子树是否是二叉排序树
if (left == 0 || pre >= T->data) // 若左子树返回0或前驱大于等于当前结点
return 0; // 则不是二叉排序树,返回0
pre = T->data; // 保存当前结点的值
right = IsBST(T->rchild); // 判断右子树是否是二叉排序树
// 因为执行到这里时,left的值一定为1,如果left为0上面的则if判断为真已经返回0了
// 所以最后直接返回右子树的结果就可以判断给定的二叉树是否是二叉排序树了
return right;
}
}
int main() {
// 构造一颗二叉排序树
Tree T = (Tree)malloc(sizeof(TreeNode));
T->data = 4;
T->lchild = (Tree)malloc(sizeof(TreeNode));
T->lchild->data = 2;
T->lchild->lchild = (Tree)malloc(sizeof(TreeNode));
T->lchild->lchild->data = 1;
T->lchild->lchild->lchild = NULL;
T->lchild->lchild->rchild = NULL;
T->lchild->rchild = (Tree)malloc(sizeof(TreeNode));
T->lchild->rchild->data = 3;
T->lchild->rchild->lchild = NULL;
T->lchild->rchild->rchild = NULL;
T->rchild = (Tree)malloc(sizeof(TreeNode));
T->rchild->data = 6;
T->rchild->lchild = (Tree)malloc(sizeof(TreeNode));
T->rchild->lchild->data = 5;
T->rchild->lchild->lchild = NULL;
T->rchild->lchild->rchild = NULL;
T->rchild->rchild = (Tree)malloc(sizeof(TreeNode));
T->rchild->rchild->data = 7;
T->rchild->rchild->lchild = NULL;
T->rchild->rchild->rchild = NULL;
// 判断是否为二叉排序树
if (IsBST(T))
printf("给定的二叉树是一颗二叉排序树。\n");
else
printf("给定的二叉树不是一颗二叉排序树。\n");
return 0;
}
```
阅读全文