请实现一个函数打印给定二叉树的中序遍历序列并判定他是否是一颗二叉搜索树用c语言实现
以下是实现代码:
#include <stdio.h>
#include <stdbool.h>
typedef struct Node {
int val;
struct Node* left;
struct Node* right;
} Node;
void inorderTraversal(Node* root, bool* isBST, int* lastVal) {
if (!root) return;
inorderTraversal(root->left, isBST, lastVal);
if (*isBST && root->val < *lastVal) {
*isBST = false;
return;
}
*lastVal = root->val;
printf("%d ", root->val);
inorderTraversal(root->right, isBST, lastVal);
}
bool isBinarySearchTree(Node* root) {
bool isBST = true;
int lastVal = INT_MIN;
inorderTraversal(root, &isBST, &lastVal);
return isBST;
}
int main() {
Node* root = (Node*)malloc(sizeof(Node));
root->val = 5;
root->left = (Node*)malloc(sizeof(Node));
root->left->val = 3;
root->left->left = (Node*)malloc(sizeof(Node));
root->left->left->val = 2;
root->left->left->left = NULL;
root->left->left->right = NULL;
root->left->right = (Node*)malloc(sizeof(Node));
root->left->right->val = 4;
root->left->right->left = NULL;
root->left->right->right = NULL;
root->right = (Node*)malloc(sizeof(Node));
root->right->val = 7;
root->right->left = (Node*)malloc(sizeof(Node));
root->right->left->val = 6;
root->right->left->left = NULL;
root->right->left->right = NULL;
root->right->right = (Node*)malloc(sizeof(Node));
root->right->right->val = 8;
root->right->right->left = NULL;
root->right->right->right = NULL;
printf("Inorder Traversal: ");
inorderTraversal(root, &(bool){true}, &(int){INT_MIN});
printf("\n");
printf("Is Binary Search Tree: %s\n", isBinarySearchTree(root) ? "true" : "false");
free(root->left->left);
free(root->left->right);
free(root->left);
free(root->right->left);
free(root->right->right);
free(root->right);
free(root);
return 0;
}
实现思路:
中序遍历二叉树,并在遍历每个节点时比较其值是否大于上一次遍历的节点的值。如果不是,则该二叉树不是二叉搜索树。如果遍历完整个二叉树后没有发现节点值不满足二叉搜索树的要求,则该二叉树是二叉搜索树。
时间复杂度:O(N),其中 N 是二叉树的节点数,因为需要遍历每个节点。
空间复杂度:O(H),其中 H 是二叉树的高度,因为需要使用递归栈。
原文地址: https://www.cveoy.top/t/topic/brdT 著作权归作者所有。请勿转载和采集!