Given a Binary Tree, the task is to check if the given binary tree is a Binary Search Tree or not. If found to be true, then print “YES”. Otherwise, print “NO”.
Examples:
Input:
9
/ \
6 10
/ \ \
4 7 11
/ \ \
3 5 8
Output: YES
Explanation: Since the left subtree of each node of the tree consists of smaller valued nodes and the right subtree of each node of the tree consists of larger valued nodes. Therefore, the required is output is “YES”.
Input:
5
/ \
6 3
/ \ \
4 9 2
Output: NO
Recursive Approach: Refer to the previous post to solve this problem using recursion.
Time Complexity: O(N) where N is the count of nodes in the Binary Tree.
Auxiliary Space: O(N)
Iterative Approach: To solve the problem iteratively, use Stack. Follow the steps below to solve the problem:
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
struct TreeNode {
int data;
TreeNode* left;
TreeNode* right;
TreeNode( int val)
{
data = val;
left = right = NULL;
}
};
bool checkTreeIsBST(TreeNode *root)
{
stack<TreeNode* > Stack;
TreeNode* prev = NULL;
while (!Stack.empty() ||
root != NULL) {
while (root != NULL) {
Stack.push(root);
root = root->left;
}
root = Stack.top();
Stack.pop();
if (prev != NULL &&
root->data <= prev->data) {
return false ;
}
prev = root;
root = root->right;
}
return true ;
}
int main()
{
TreeNode *root = new TreeNode(9);
root->left = new TreeNode(6);
root->right = new TreeNode(10);
root->left->left = new TreeNode(4);
root->left->right = new TreeNode(7);
root->right->right = new TreeNode(11);
root->left->left->left = new TreeNode(3);
root->left->left->right = new TreeNode(5);
root->left->right->right = new TreeNode(8);
if (checkTreeIsBST(root)) {
cout<< "YES" ;
}
else {
cout<< "NO" ;
}
}
|
Java
import java.util.*;
class GFG{
static class TreeNode {
int data;
TreeNode left;
TreeNode right;
TreeNode( int val)
{
data = val;
left = right = null ;
}
};
static boolean checkTreeIsBST(TreeNode root)
{
Stack<TreeNode > Stack = new Stack<TreeNode >();
TreeNode prev = null ;
while (!Stack.isEmpty() ||
root != null ) {
while (root != null ) {
Stack.add(root);
root = root.left;
}
root = Stack.peek();
Stack.pop();
if (prev != null &&
root.data <= prev.data) {
return false ;
}
prev = root;
root = root.right;
}
return true ;
}
public static void main(String[] args)
{
TreeNode root = new TreeNode( 9 );
root.left = new TreeNode( 6 );
root.right = new TreeNode( 10 );
root.left.left = new TreeNode( 4 );
root.left.right = new TreeNode( 7 );
root.right.right = new TreeNode( 11 );
root.left.left.left = new TreeNode( 3 );
root.left.left.right = new TreeNode( 5 );
root.left.right.right = new TreeNode( 8 );
if (checkTreeIsBST(root)) {
System.out.print( "YES" );
}
else {
System.out.print( "NO" );
}
}
}
|
Python3
class TreeNode:
def __init__( self , data: int ) - > None :
self .data = data
self .left = None
self .right = None
def checkTreeIsBST(root: TreeNode) - > bool :
Stack = []
prev = None
while (Stack or root):
while root:
Stack.append(root)
root = root.left
root = Stack.pop()
if (prev and root.data < = prev.data):
return False
prev = root
root = root.right
return True
if __name__ = = "__main__" :
root = TreeNode( 9 )
root.left = TreeNode( 6 )
root.right = TreeNode( 10 )
root.left.left = TreeNode( 4 )
root.left.right = TreeNode( 7 )
root.right.right = TreeNode( 11 )
root.left.left.left = TreeNode( 3 )
root.left.left.right = TreeNode( 5 )
root.left.right.right = TreeNode( 8 )
if checkTreeIsBST(root):
print ( "YES" )
else :
print ( "NO" )
|
C#
using System;
using System.Collections.Generic;
class GFG
{
class TreeNode
{
public int data;
public TreeNode left;
public TreeNode right;
public TreeNode( int val)
{
data = val;
left = right = null ;
}
};
static bool checkTreeIsBST(TreeNode root)
{
Stack<TreeNode > Stack = new Stack<TreeNode >();
TreeNode prev = null ;
while (Stack.Count!=0 ||
root != null )
{
while (root != null )
{
Stack.Push(root);
root = root.left;
}
root = Stack.Peek();
Stack.Pop();
if (prev != null &&
root.data <= prev.data)
{
return false ;
}
prev = root;
root = root.right;
}
return true ;
}
public static void Main(String[] args)
{
TreeNode root = new TreeNode(9);
root.left = new TreeNode(6);
root.right = new TreeNode(10);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(7);
root.right.right = new TreeNode(11);
root.left.left.left = new TreeNode(3);
root.left.left.right = new TreeNode(5);
root.left.right.right = new TreeNode(8);
if (checkTreeIsBST(root))
{
Console.Write( "YES" );
}
else
{
Console.Write( "NO" );
}
}
}
|
Javascript
<script>
class TreeNode
{
constructor(val)
{
this .left = null ;
this .right = null ;
this .data = val;
}
}
function checkTreeIsBST(root)
{
let Stack = [];
let prev = null ;
while (Stack.length > 0 || root != null )
{
while (root != null )
{
Stack.push(root);
root = root.left;
}
root = Stack[Stack.length - 1];
Stack.pop();
if (prev != null &&
root.data <= prev.data)
{
return false ;
}
prev = root;
root = root.right;
}
return true ;
}
let root = new TreeNode(9);
root.left = new TreeNode(6);
root.right = new TreeNode(10);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(7);
root.right.right = new TreeNode(11);
root.left.left.left = new TreeNode(3);
root.left.left.right = new TreeNode(5);
root.left.right.right = new TreeNode(8);
if (checkTreeIsBST(root))
{
document.write( "YES" );
}
else
{
document.write( "NO" );
}
</script>
|
Time Complexity: O(N), where N is count of nodes in the binary tree
Auxiliary Space: O(N)