This is one of the interview questions.
Given a binary tree, find out whether it is a binary search tree.
A binary search tree is an ordered binary tree which satisfies binary search tree property, which states that the key in each node must be greater than or equal to any key stored in the left sub-tree, and less than or equal to any key stored in the right sub-tree.
This diagram shows a BST, because each node has key value larger than left subtree and smaller than right subtree.
This is not a binary search tree because key value of left child of root is larger than 2. And key value of node 7 is has a right child whose value is lesser than 7.
How to write a function
If the in order traversal output does not give key values in ascending order, then the tree is not a binary search tree.
But inorder is a recursive function. So we can not directly compare values. We need to use a global variable to store the value of a node. And as node is visited, it is compared with this global variable - say prevValue. If value of node is smaller than prevValue, then tree is not a BST.
This property must be tested on left and right subtrees also. If left subtree or right subtree is not a BST, then we return false (or 0 in C).
Here is the function
And here is complete program. I have created two trees - one BST and another non-bst. The nodes have to linked explicitly because the ordinary insert methods rely on BST property and would create a BST always.
Given a binary tree, find out whether it is a binary search tree.
A binary search tree is an ordered binary tree which satisfies binary search tree property, which states that the key in each node must be greater than or equal to any key stored in the left sub-tree, and less than or equal to any key stored in the right sub-tree.
A binary Search Tree |
Binary Tree but not a Binary search tree |
This is not a binary search tree because key value of left child of root is larger than 2. And key value of node 7 is has a right child whose value is lesser than 7.
How to write a function
If the in order traversal output does not give key values in ascending order, then the tree is not a binary search tree.
But inorder is a recursive function. So we can not directly compare values. We need to use a global variable to store the value of a node. And as node is visited, it is compared with this global variable - say prevValue. If value of node is smaller than prevValue, then tree is not a BST.
This property must be tested on left and right subtrees also. If left subtree or right subtree is not a BST, then we return false (or 0 in C).
Here is the function
int isBST(NODEPTR nd)
{
if(nd!=NULL)
{
if(!isBST(nd->left))
return 0;
if(nd->val<prevValue)
return 0;
prevValue = nd->val;
return isBST(nd->right);
}
else
return 1;
}
And here is complete program. I have created two trees - one BST and another non-bst. The nodes have to linked explicitly because the ordinary insert methods rely on BST property and would create a BST always.
#include<stdio.h>
#include<stdlib.h>
struct node
{
int val;
struct node *left;
struct node *right;
};
typedef struct node *NODEPTR;
static int prevValue;
NODEPTR create_node(int num)
{
NODEPTR temp = (NODEPTR)malloc(sizeof(struct node));
temp->val = num;
temp->left = NULL;
temp->right = NULL;
return temp;
}
NODEPTR insert_node(NODEPTR nd,NODEPTR newnode)
{
if(nd==NULL)
return newnode;/* newnode becomes root of tree*/
if(newnode->val > nd->val)
nd->right = insert_node(nd->right,newnode);
else if(newnode->val < nd->val)
nd->left = insert_node(nd->left,newnode);
return nd;
}
NODEPTR create_tree1()
{
NODEPTR n1,n2,n3,n4,n5,n6,n7,root;
n1 = create_node(10);
n2 = create_node(20);
n3 = create_node(30);
n4 = create_node(40);
n5 = create_node(50);
n6 = create_node(60);
n7 = create_node(70);
root = n3;
n3->left = n1;
n1->right = n2;
n3->right = n6;
n6->left = n4;
n4->right = n5;
n6->right = n7;
return root;
}
NODEPTR create_tree2()
{
NODEPTR n1,n2,n3,n4,n5,n6,n7,root;
n1 = create_node(10);
n2 = create_node(20);
n3 = create_node(30);
n4 = create_node(40);
n5 = create_node(50);
n6 = create_node(60);
n7 = create_node(70);
root = n3;
n3->left = n1;
n1->left = n2;
n3->right = n6;
n6->left = n4;
n4->right = n5;
n6->right = n7;
return root;
}
void in_order(NODEPTR nd)
{
if(nd!=NULL)
{
in_order(nd->left);
printf("%d---",nd->val);
in_order(nd->right);
}
}
int isBST(NODEPTR nd)
{
if(nd!=NULL)
{
if(!isBST(nd->left))
return 0;
if(nd->val<prevValue)
return 0;
prevValue = nd->val;
return isBST(nd->right);
}
else
return 1;
}
int main()
{
NODEPTR root=NULL,delnode;
int n;
root = create_tree1();
printf("\nInorder traversal\n");
in_order(root);
if(isBST(root))
printf("The tree is a binary search tree");
else
printf("The tree is not a binary search tree");
root =create_tree2();
in_order(root);
if(isBST(root))
printf("this tree is a binary search tree");
else
printf("this tree is not a binary search tree");
return 0;
}
Comments
Post a Comment