Quick actions

cmd+k|ctrl+k

Navigation

Languages

Implementation of Binary Search Tree

Snippet info

Language

JavaScript

Visibility

public

Author

dhamankovachi1

Created

2023-11-13T13:52:30.158356Z

Updated

2023-11-17T14:18:47.114379Z

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

class BinarySearchTree {
  constructor(){
    this.root = null;
  }
  insert(value){
    const newNode = new Node(value);
    if (this.root === null) {
      this.root = newNode;
    } else {
      let currentNode = this.root;
      while(true){
        if(value < currentNode.value){
          //Left
          if(!currentNode.left){
            currentNode.left = newNode;
            return this;
          }
          currentNode = currentNode.left;
        } else {
          //Right
          if(!currentNode.right){
            currentNode.right = newNode;
            return this;
          } 
          currentNode = currentNode.right;
        }
      }
    }
  }
  lookup(value){
    if (!this.root) {
      return false;
    }
    let currentNode = this.root;
    while(currentNode){
      if(value < currentNode.value){
        currentNode = currentNode.left;
      } else if(value > currentNode.value){
        currentNode = currentNode.right;
      } else if (currentNode.value === value) {
        return currentNode;
      }
    }
    return null
  }
  // remove
  remove(value){
      if(!this.root){
          return false;
      }
      let currentNode=this.root;
      let parentNode=null;
      while(currentNode){
          if(value<currentNode.value){
              parentNode=currentNode;
              currentNode=currentNode.left;
          }
          else if (value>currentNode.value){
              parentNode=currentNode;
              currentNode=currentNode.right;
          }
          else if(value===currentNode.value){
              //if it has no right child
              if(currentNode.right===null){
                  if(parentNode===null){
                      this.root=currentNode.left
                  }else{
                      if(currentNode.value<parentNode.value){
                          parentNode.left=currentNode.left;
                      }
                      else if(currentNode.value>parentNode.value){
                          parentNode.right=currentNode.left;
                      }
                  }
              }
              else if(currentNode.right.left===null){
                  currentNode.right.left=currentNode.left;
                  if(parentNode===null){
                      this.root=currentNode.right;
                  }
                  else{
                      if(currentNode.value<parentNode.value){
                          parentNode.left=currentNode.right;
                      }
                      else if(currentNode.value>parentNode.value){
                          parentNode.right=currentNode.right
                      }
                      else{
                          let leftmost=currentNode.right.left;
                          let leftmostParent=currentNode.right;
                          while(leftmost!==null){
                              leftmostParent=leftmost;
                              leftmost=leftmost.left;
                          }
                          leftmostParent.left=leftmost.right;
                          leftmost.left=currentNode.left;
                          leftmost.right=currentNode.right;
                          
                          if(parentNode===null){
                              this.root=leftmost;
                          }
                          else{
                              if(currentNode.value<parentNode.value){
                                  parentNode.left=leftmost;
                              }
                              else if(currentNode.value>parentNode.value){
                                  parentNode.right=leftmost;
                              }
                          }
                      }
                    return false;
                  }
              }
          }
      }
  }
}

const tree = new BinarySearchTree();
tree.insert(9)
tree.insert(4)
tree.insert(6)
tree.insert(20)
tree.insert(170)
tree.insert(15)
tree.insert(1)
// JSON.stringify(traverse(tree.root))
tree.lookup(15);
tree.lookup(7);

//     9
//  4     20
//1  6  15  170

function traverse(node) {
  const tree = { value: node.value };
  tree.left = node.left === null ? null : traverse(node.left);
  tree.right = node.right === null ? null : traverse(node.right);
  return tree;
}





INFO