Last active
August 29, 2015 14:26
-
-
Save beeeku/6b62b6250a752443653f to your computer and use it in GitHub Desktop.
A program that finds out whether a binary tree is a BST or not
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <limits.h> | |
/* A binary tree node has data, pointer to left child | |
and a pointer to right child */ | |
struct node | |
{ | |
int data; | |
struct node* left; | |
struct node* right; | |
}; | |
int isBSTUtil(struct node* node, int min, int max); | |
/* Returns true if the given tree is a binary search tree | |
(efficient version). */ | |
int isBST(struct node* node) | |
{ | |
return(isBSTUtil(node, INT_MIN, INT_MAX)); | |
} | |
/* Returns true if the given tree is a BST and its | |
values are >= min and <= max. */ | |
int isBSTUtil(struct node* node, int min, int max) | |
{ | |
/* an empty tree is BST */ | |
if (node==NULL) | |
return 1; | |
/* false if this node violates the min/max constraint */ | |
if (node->data < min || node->data > max) | |
return 0; | |
/* otherwise check the subtrees recursively, | |
tightening the min or max constraint */ | |
return | |
isBSTUtil(node->left, min, node->data-1) && // Allow only distinct values | |
isBSTUtil(node->right, node->data+1, max); // Allow only distinct values | |
} | |
/* Helper function that allocates a new node with the | |
given data and NULL left and right pointers. */ | |
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); | |
} | |
/* Driver program to test above functions*/ | |
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); | |
if(isBST(root)) | |
printf("Is BST"); | |
else | |
printf("Not a BST"); | |
getchar(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment