给定一个二叉树的广义表表示(节点值为整数),判定该二叉树是否为二叉搜索树。 c语言
时间: 2023-06-10 12:09:17 浏览: 144
二叉搜索树(BST)的定义是:对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,其右子树中的所有节点的值都大于该节点的值。
对于二叉树的广义表表示,我们可以按照以下步骤来判断是否为BST:
1. 将广义表表示转换为二叉树的数据结构,可以使用递归方法实现。具体方法是:从广义表中读取当前节点的值,然后读取下一个节点,如果下一个节点是“(”,说明当前节点有左子树,继续递归读取左子树;如果下一个节点是数字,说明当前节点没有左子树,将读取的数字作为当前节点的左子节点;如果下一个节点是“)”,说明当前节点没有左子树,左子节点为空。同理可以读取右子树。
2. 对于每个节点,判断其是否满足BST的定义,即其左子树的所有节点都小于该节点的值,其右子树的所有节点都大于该节点的值。可以使用递归方法实现。具体方法是:对于每个节点,检查其左子树是否满足BST的定义,检查其右子树是否满足BST的定义,同时检查其左子树中的所有节点的值是否都小于该节点的值,其右子树中的所有节点的值是否都大于该节点的值。
下面是C语言实现的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 二叉树节点结构体
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
// 读取一个数值节点
struct TreeNode* readNode(char** s) {
int num = 0;
bool negative = false;
if (**s == '-') {
negative = true;
(*s)++;
}
while (**s >= '0' && **s <= '9') {
num = num * 10 + **s - '0';
(*s)++;
}
if (negative) {
num = -num;
}
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->val = num;
node->left = NULL;
node->right = NULL;
return node;
}
// 读取一个子树
struct TreeNode* readSubtree(char** s) {
(*s)++; // 跳过 '('
if (**s == ')') {
(*s)++; // 跳过 ')'
return NULL;
}
struct TreeNode* root = readNode(s);
root->left = readSubtree(s);
root->right = readSubtree(s);
(*s)++; // 跳过 ')'
return root;
}
// 广义表表示转换为二叉树
struct TreeNode* treeFromStr(char* s) {
if (*s == '(') {
return readSubtree(&s);
}
else {
return NULL;
}
}
// 判断一棵树是否为BST
bool isBST(struct TreeNode* root, int min, int max) {
if (root == NULL) {
return true;
}
if (root->val <= min || root->val >= max) {
return false;
}
return isBST(root->left, min, root->val) && isBST(root->right, root->val, max);
}
int main() {
char* s = "(5(3(2)(4))(8(6)(10)))"; // BST
struct TreeNode* root = treeFromStr(s);
bool result = isBST(root, INT_MIN, INT_MAX);
printf("%s\n", result ? "true" : "false");
s = "(5(3(2)(4))(8(10)(6)))"; // not BST
root = treeFromStr(s);
result = isBST(root, INT_MIN, INT_MAX);
printf("%s\n", result ? "true" : "false");
return 0;
}
```
输出结果为:
```
true
false
```
阅读全文