给定一个二叉树的广义表表示(节点值为整数),判定该二叉树是否为二叉搜索树。c代码
时间: 2024-01-23 16:06:31 浏览: 101
概念示例-树与二叉树课件
以下是判断二叉树是否为二叉搜索树的C语言代码实现:
```c
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
// 二叉树的结点结构体
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
// 栈的结构体
struct Stack {
struct TreeNode *data[1000];
int top;
};
// 创建一个栈
struct Stack* createStack() {
struct Stack *stack = (struct Stack*)malloc(sizeof(struct Stack));
stack->top = -1;
return stack;
}
// 判断栈是否为空
bool isEmpty(struct Stack *stack) {
return stack->top == -1;
}
// 入栈
void push(struct Stack *stack, struct TreeNode *node) {
stack->data[++stack->top] = node;
}
// 出栈
struct TreeNode* pop(struct Stack *stack) {
if (!isEmpty(stack)) {
return stack->data[stack->top--];
}
return NULL;
}
// 获取栈顶元素
struct TreeNode* top(struct Stack *stack) {
if (!isEmpty(stack)) {
return stack->data[stack->top];
}
return NULL;
}
// 判断一个二叉树是否为二叉搜索树
bool isValidBST(struct TreeNode* root){
if (!root) {
return true;
}
struct Stack *stack = createStack();
struct TreeNode *p = root;
int preVal = INT_MIN;
while (p || !isEmpty(stack)) {
while (p) {
push(stack, p);
p = p->left;
}
p = pop(stack);
if (p->val <= preVal) {
return false;
}
preVal = p->val;
p = p->right;
}
return true;
}
```
以上代码中,我们使用了一个栈数据结构来辅助遍历二叉树,并使用中序遍历的方式判断一个二叉树是否为二叉搜索树。具体来说,我们在遍历过程中维护一个变量`preVal`,表示当前节点的前一个节点的值。如果当前节点的值小于等于`preVal`,则说明不满足二叉搜索树的定义,返回false。如果遍历完整棵树,都没有发现不满足二叉搜索树的定义的情况,则说明满足,返回true。
阅读全文