check if a tree is a binary search tree

35,414

Solution 1

right, another simple solution is do an inorder visit

java code here

Solution 2

boolean bst = isBST(root, Integer.MIN_VALUE, Integer.MAX_VALUE);

public boolean isBST(Node root, int min, int max) {
    if(root == null) 
        return true;

    return (root.data > min &&
            root.data < max &&
            isBST(root.left, min, root.data) &&
            isBST(root.right, root.data, max));
    }

Solution 3

UPDATE: I just saw that this solution was suggested before. Sorry about this guys, maybe somebody still finds my version useful

Here is a solution that uses In-Order Traversal to check for BST property. Before I provide the solution, I am using a definition of a BST that doesn't allow duplicates. This means that each value in the BST is unique (this is just for simplicity).

Code for recursive inorder print:

void printInorder(Node root) {
    if(root == null) {                 // base case
        return;
    }
    printInorder(root.left);           // go left
    System.out.print(root.data + " "); // process (print) data
    printInorder(root.right);          // go right
}

After this inorder traversal on a BST, all the data should be printed in sorted ascending order. For example the tree:

   5
 3   7
1 2 6 9

would have inorder print:

1 2 3 5 6 7 9

Now, instead of printing the node, we can keep track of the previous value in the In-Order sequence and compare it to the current node's value. If the current node's value is smaller than the previous value, this means that the sequence isn't in the ascending sorted order and that the BST property is violated.

For example, the tree:

   5
 3   7
1 8 6 9

Has a violation. The right child of 3 is 8 and this would be ok if 3 was the root node. However, in a BST 8 would end up as a left child of 9 and not as a right child of 3. Therefore, this tree is not a BST. So, the code that follow this idea:

/* wrapper that keeps track of the previous value */
class PrevWrapper {
    int data = Integer.MIN_VALUE;
}

boolean isBST(Node root, PrevWrapper prev) {
    /* base case: we reached null*/
    if (root == null) {
        return true;
    }

    if(!isBST(root.left, prev)) {
        return false;
    }
    /* If previous in-order node's data is larger than
     * current node's data, BST property is violated */
    if (prev.data > root.data) {
        return false;
    }

    /* set the previous in-order data to the current node's data*/
    prev.data = root.data;

    return isBST(root.right, prev);
}

boolean isBST(Node root) {
    return isBST(root, new PrevWrapper());
}

The in-order traversal for the sample tree would fail the check for node 5 since previous in-order of 5 is 8, which is larger so BST property is violated.

Solution 4

    boolean isBST(TreeNode root, int max, int min) {
        if (root == null) {
            return true;
        } else if (root.val >= max || root.val <= min) {
            return false;
        } else {
            return isBST(root.left, root.val, min) && isBST(root.right, max, root.val);
        }

    }

an alternative way solving this problem.. similar with your code

Solution 5

A binary search tree has the following properties where the key for the left node must be <= the root node key and the right node key must be greater that the root.

So the problem we have is if the keys in the tree are not unique and a in order traversal was done we could get a situation of two in order traversals producing the same sequence, where 1 would be a valid bst and the other would not, this would happen if we had a tree where the left node = root(valid bst) and the right node = root(invalid not a bst).

To get around this we need to maintain a valid min/max range that the key being 'visited' must fall between, and we pass this range as we recurse to other nodes.

#include <limits>

int min = numeric_limits<int>::min();
int max = numeric_limits<int>::max();

The calling function will pass the above min and max values initially to isBst(...)

bool isBst(node* root, int min, int max)
{
    //base case
    if(root == NULL)
        return true;

    if(root->val <= max && root->val >= min)
    {
        bool b1 = isBst(root->left, min, root->val);
        bool b2 = isBst(root->right, root->val, max);
        if(!b1 || !b2)
            return false;
        return true;
    }
    return false;
}
Share:
35,414
TimeToCodeTheRoad
Author by

TimeToCodeTheRoad

Updated on February 16, 2020

Comments

  • TimeToCodeTheRoad
    TimeToCodeTheRoad about 4 years

    I have written the following code to check if a tree is a Binary search tree. Please help me check the code:

    Okay! The code is edited now. This simple solution was suggested by someone in the posts below:

    IsValidBST(root,-infinity,infinity);
    
    bool IsValidBST(BinaryNode node, int MIN, int MAX) 
    {
         if(node == null)
             return true;
         if(node.element > MIN 
             && node.element < MAX
             && IsValidBST(node.left,MIN,node.element)
             && IsValidBST(node.right,node.element,MAX))
             return true;
         else 
             return false;
    }