Quick actions

cmd+k|ctrl+k

Navigation

Languages

Check if BST

Snippet info

Language

JavaScript

Visibility

public

Author

varun.muriyanat

Created

2025-06-09T19:33:22.24346Z

Updated

2025-06-09T21:05:24.877575Z

class Node {
    constructor(value) {
        this.value = value;
        this.left = null;
        this.right = null;
    }
}

class BinarySearchTree {
    constructor() {
        this.root = null;
    }
    
    insert(value) {
        let node = new Node(value);
        if (this.root === null) {
            this.root = node;
            return this;
        }
        
        let curr = this.root;
        while(curr !== null) {
            if (value > curr.value) {
                if (curr.right) {
                    curr = curr.right;    
                } else {
                    curr.right = node;
                    return;
                }
            } else {
                if (curr.left) {
                    curr = curr.left;    
                } else {
                    curr.left = node;
                    return;
                }
            }
        }
    }
    
    lookup(value) {
        if (this.root === null) {
            return null;
        }
        
        let curr = this.root;
        while (curr !== null ) {
            if (value > curr.value) { // go right
                if (curr.right) {
                    curr = curr.right;
                } else {
                    return null;
                }
            } else if( value < curr.value) { // go left, ie value is less than curr.value
                if (curr.left) {
                    curr = curr.left;
                } else {
                    return null;
                }
            } else { // if value == curr.value
                return curr;
            }
        }
    }
    
    remove(value) {
        if (this.root === null) {
            return null;
        }
        
        let parent = this.root;
        let curr = this.root;
        let left = this.root.left;
        let right = this.root.right;
        while (curr !== null ) {
            console.log(curr.value);
            if (value > curr.value) {
                console.log("going right");
                parent = curr;
                curr = curr.right;
                left = curr.left;
                right = curr.right;
            } else if (value < curr.value) {
                console.log("going left");
                parent = curr;
                curr = curr.left
                left = curr.left;
                right = curr.right;
            } else if (curr.value === value) {
                if (curr.left === null && curr.right === null) { // leaf node
                    if (value < parent.value) {
                        parent.left = null;
                    } else {
                        parent.right = null;
                    }
                    return curr;
                }
                
                if (curr.right.left === null && curr.right.right === null) {
                    parent.right = curr.right;
                    parent.right.left = left;
                    return curr;
                }
                
                if (curr.right.left === null && curr.right.right !== null) {
                    parent.right = curr.right;
                    parent.right.left = left;
                    return curr;
                }
                
                if (curr.right.left !== null && curr.right.right === null) {
                    parent.right = curr.right.left;
                    parent.right.right = curr.right;
                    parent.right.left = curr.left;
                    curr.right.left = null;
                }
                
                curr = null;
            }
        }
        
    }
    
    preorderTraversal(node, list) {
        list.push(node.value);
        if (node.left !== null) {
            this.preorderTraversal(node.left, list);
        }
        if (node.right !== null) {
            this.preorderTraversal(node.right, list);
        }
        return list;
    }
    
    postorderTraversal(node, list) {
        if (node.left !== null) {
            this.postorderTraversal(node.left, list);
        }
        if (node.right !== null) {
            this.postorderTraversal(node.right, list);
        }
        list.push(node.value);
        return list;
    }
    
    inorderTraversal(node, list) {
        if (node.left !== null) {
            this.inorderTraversal(node.left, list);
        }
        list.push(node.value);
        if (node.right !== null) {
            this.inorderTraversal(node.right, list);
        }
        return list;
    }
}


// Helper function to check if a tree is BST 
// within a given range
function isBSTUtil(node, min, max) {
    if (node === null) return true;

    // If the current node's data 
    // is not in the valid range, return false
    if (node.data < min || node.data > max) return false;

    // Recursively check the left and 
    // right subtrees with updated ranges
    return isBSTUtil(node.left, min, node.data - 1) &&
           isBSTUtil(node.right, node.data + 1, max);
}

// Function to check if the entire binary tree is a BST
function isBST(root) {
    return isBSTUtil(root, -Infinity, Infinity);
}




const tree = new BinarySearchTree();
tree.insert(9);
tree.insert(4);
tree.insert(20);
tree.insert(1);
tree.insert(6);
tree.insert(15);
tree.insert(170);
// tree.insert(180);
// tree.insert(179);
// tree.insert(181);
// tree.insert(150);
// console.log(tree.remove(20));


if (isBST(tree.root)) {
    console.log("True");
} else {
    console.log("False");
}
INFO