Метод удаления BST не работает в JavaScript

Я пытаюсь создать класс двоичного дерева поиска (BST) в JavaScript. В JS объекты передаются / назначаются по ссылке, но похоже, что у этого есть проблема с методом удаления. Метод удаления не удаляет узел, который я хочу удалить. Любая помощь приветствуется. Вот код

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

}

class BST {
  constructor() {
    this.root = null;
  }

  add(value){
    if(!this.root){
      this.root = new Node(value);
      return this;
    }
    addNode(this.root);
    return this;

    function addNode(node) {
      if(value < node.value){
        if(!node.left){
          node.left = new Node(value);
        }else{
          addNode(node.left);
        }
      }

      if(node.value < value){
        if(!node.right){
          node.right = new Node(value);
        }else{
          addNode(node.right);
        }
      }
    }
  }

  find(value){
    if(!this.root){
      return;
    }
    return findNode(this.root);

    function findNode(node) {
      if(node.value === value){
        return node;
      }
      if(value < node.value){
        if(!node.left){
          return;
        }else{
          return findNode(node.left);
        }
      }else{
        if(!node.right){
          return;
        }else{
          return findNode(node.right);
        }
      }
    }

  }

  remove(value){
    if(!this.root){
      return this;
    }
    return removeNode(this.root);

    function removeNode(node) {
      if(node.value === value){
        return actualRemoval(node);
      }
      if(value < node.value){
        if(!node.left){
          return;
        }else{
          return removeNode(node.left);
        }
      }else{
        if(!node.right){
          return;
        }else{
          return removeNode(node.right);
        }
      }
    }

    function actualRemoval(node) {
      let tmp = Object.assign(node);
      if(!node.left && !node.right){
        node = null;
        return tmp;
      }
      if(!node.left){
        node = node.right;
        return tmp;
      }
      if(!node.right){
        node = node.left;
        return tmp;
      }
      //if the node has both the children.
      node.value = popMin(node.right).value;
      return tmp;
    }

    function popMin(node) {
      if(!node.left){
        let tmp = Object.assign(node);
        node = node.right;
        return tmp;
      }
      return popMin(node.left);
    }


  }//end of function remove()

}//end of class BST

let myBST = new BST();
myBST.add(5).add(6).add(3).add(4).add(7).add(5.5)
// console.log(myBST.add(5).add(6).add(3).add(4).add(7).add(5.5));
// console.log(myBST.find(6));

console.log(myBST.remove(3));
console.log(myBST);

Во второй последней строке я пытаюсь удалить узел со значением 3. Но в последней строке отображается дерево с узлом 3, присутствующим в нем.

0 ответов

remove(value){
    if(!this.root){
      return this;
    }
    return removeNode(this.root, null);//second argument is the

    function removeNode(node, parent, leftOrRight) {
      if(node.value === value){
        return actualRemoval(node, parent, leftOrRight);
      }
      if(value < node.value){
        if(!node.left){
          return;
        }else{
          return removeNode(node.left, node, "l");
        }
      }else{
        if(!node.right){
          return;
        }else{
          return removeNode(node.right, node, "r");
        }
      }
    }
    function actualRemoval(node, parent, leftOrRight) {
      let tmp = Object.assign(node);
      if(!node.left && !node.right){
        if(parent){
          if(leftOrRight === "l"){
            parent.left = null;
          }else{
            parent.right = null;
          }
        }else{
          node = null;
        }
        return tmp;
      }
      if(!node.left){
        if(parent){
          if(leftOrRight === "l"){
            parent.left = node.right;
          }else{
            parent.right = node.right;
          }
        }else{
          node = node.right; //this case runs once node is root
        }
        return tmp;

      }
      if(!node.right){
        if(parent){
          if(leftOrRight === "l"){
            parent.left = node.leftt;
          }else{
            parent.right = node.left;
          }
        }else{
          node = node.left; //this case runs once node is root
        }
        return tmp;
      }
      //if the node has both the children.
      node.value = popMin(node.right, node, "r").value;//it is always called for right side with popMin
      return tmp;
    }
    function popMin(node, parent, leftOrRight) {
      if(!node.left){
        let tmp = Object.assign(node);
        if(leftOrRight == "l"){
          parent.left = node.right;
        }else{
          parent.right = node.right;
        }
        return tmp;
      }
      return popMin(node.left, node, "l");
    }
  }
Другие вопросы по тегам