用C语言写一个在中序遍历输出一棵二叉树的同时判断该二叉树是否为BST
时间: 2023-11-02 17:08:58 浏览: 101
以下是用C语言实现的代码,其中使用了递归的方式实现中序遍历,并在遍历过程中判断二叉树是否为BST:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h> // 使用 INT_MIN 和 INT_MAX 宏定义
// 定义二叉树节点结构体
struct Node {
int data;
struct Node* left;
struct Node* right;
};
// 创建一个新的二叉树节点
struct Node* newNode(int data) {
struct Node* node = (struct Node*) malloc(sizeof(struct Node));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
// 中序遍历二叉树并判断是否为BST
int isBSTUtil(struct Node* node, int min, int max) {
if (node == NULL) return 1; // 空树为BST
if (node->data < min || node->data > max) return 0; // 不满足BST条件
return isBSTUtil(node->left, min, node->data - 1) && isBSTUtil(node->right, node->data + 1, max); // 递归判断左右子树
}
// 判断是否为BST
int isBST(struct Node* node) {
return isBSTUtil(node, INT_MIN, INT_MAX); // INT_MIN 和 INT_MAX 是 C 语言中 int 类型的最小值和最大值
}
// 中序遍历并输出二叉树
void inOrder(struct Node* node) {
if (node == NULL) return;
inOrder(node->left);
printf("%d ", node->data);
inOrder(node->right);
}
int main() {
// 创建一棵二叉树
struct Node* root = newNode(4);
root->left = newNode(2);
root->right = newNode(5);
root->left->left = newNode(1);
root->left->right = newNode(3);
// 中序遍历并输出二叉树
printf("In-order traversal:\n");
inOrder(root);
printf("\n");
// 判断二叉树是否为BST
if (isBST(root)) {
printf("This binary tree is a BST.\n");
} else {
printf("This binary tree is not a BST.\n");
}
return 0;
}
```
上面的代码中,`isBSTUtil` 函数用来判断一棵二叉树是否为BST,参数 `min` 和 `max` 表示当前节点的值必须在 `[min, max]` 的范围内,否则不满足BST条件。`isBST` 函数用来调用 `isBSTUtil` 函数并返回结果。`inOrder` 函数用来中序遍历二叉树并输出节点的值。最后在 `main` 函数中创建一棵二叉树并调用相关函数进行操作。
阅读全文