trekhleb / javascript-algorithms

📝 Algorithms and data structures implemented in JavaScript with explanations and links to further readings
MIT License
185.7k stars 29.95k forks source link

Bug in AVL Tree rorateLeftLeft and rotateRightRight #325

Open venusliang opened 5 years ago

venusliang commented 5 years ago

run code

  const avl = new AvlTree();
  avl.insert(24);
  avl.insert(12);
  avl.insert(34);
  avl.insert(26);
  avl.insert(25);
  console.log(avl.toString());  // output:  25,26,34,24,34

left child 12 is modified to a duplicate value 34.

  const avl = new AvlTree();
  avl.insert(24);
  avl.insert(12);
  avl.insert(34);
  avl.insert(15);
  avl.insert(18);
  console.log(avl.toString());  // output: 12,24,12,15,18

same question. fix code:

  rotateLeftLeft(rootNode) {
    // Detach left node from root node.
    const leftNode = rootNode.left;
    rootNode.setLeft(null);

    // Make left node to be a child of rootNode's parent.
    if (rootNode.parent) {
      rootNode.parent.replaceChild(rootNode, leftNode);
    } else if (rootNode === this.root) {
      // If root node is root then make left node to be a new root.
      this.root = leftNode;
    }

    // If left node has a right child then detach it and
    // attach it as a left child for rootNode.
    if (leftNode.right) {
      rootNode.setLeft(leftNode.right);
    }

    // Attach rootNode to the right of leftNode.
    leftNode.setRight(rootNode);
  }
  rotateRightRight(rootNode) {
    // Detach right node from root node.
    const rightNode = rootNode.right;
    rootNode.setRight(null);

    // Make right node to be a child of rootNode's parent.
    if (rootNode.parent) {
      rootNode.parent.replaceChild(rootNode, rightNode);
    } else if (rootNode === this.root) {
      // If root node is root then make right node to be a new root.
      this.root = rightNode;
    }

    // If right node has a left child then detach it and
    // attach it as a right child for rootNode.
    if (rightNode.left) {
      rootNode.setRight(rightNode.left);
    }

    // Attach rootNode to the left of rightNode.
    rightNode.setLeft(rootNode);
  }
SHISME commented 5 years ago

I found the problem too

oushu1tanqiang1 commented 11 months ago

find +1