Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Các phép xoay AVL trong JavaScript


Để tự cân bằng, AVL tree có thể thực hiện 4 loại xoay sau:

  • Xoay trái (Left rotation)
  • Xoay phải (Right rotation)
  • Xoay trái-phải (Left-Right rotation)
  • Xoay phải-trái (Right-Left rotation)

Hai xoay đầu là xoay đơn, hai xoay sau là xoay kép. Để có cây mất cân bằng, ta cần cây chiều cao ít nhất 2. Với cây đơn giản này, hãy hiểu từng loại một.

Xoay Trái (Left Rotation)

Nếu cây mất cân bằng khi một nút được chèn vào cây con phải của cây con phải, ta thực hiện xoay trái đơn:

Các phép xoay AVL trong JavaScript

Trong ví dụ, nút A mất cân bằng vì nút được chèn vào cây con phải của cây con phải của A. Ta thực hiện xoay trái bằng cách làm A thành cây con trái của B. Xoay này cũng gọi là xoay LL. Hãy xem triển khai:

function rotationLL(node) {
  let tmp = node.left;
  node.left = tmp.right;
  tmp.right = node;
  return tmp;
}

Xoay Phải (Right Rotation)

AVL tree có thể mất cân bằng nếu nút được chèn vào cây con trái của cây con trái. Cây lúc này cần xoay phải.

Các phép xoay AVL trong JavaScript

Như hình vẽ, nút mất cân bằng trở thành con phải của con trái của nó bằng cách xoay phải. Đây cũng gọi là xoay RR. Hãy xem code:

function rotationRR(node) {
  let tmp = node.right;
  node.right = tmp.left;
  tmp.left = node;
  return tmp;
}

Xoay Trái-Phải (Left-Right Rotation)

Xoay kép là phiên bản phức tạp hơn của các xoay đã giải thích. Để hiểu rõ hơn, nên chú ý từng hành động khi xoay. Hãy xem cách thực hiện xoay Trái-Phải. Xoay trái-phải là kết hợp xoay trái theo sau bởi xoay phải.

Trạng tháiHành động
Các phép xoay AVL trong JavaScriptMột nút đã được chèn vào cây con phải của cây con trái. Điều này làm C thành nút mất cân bằng. Các tình huống này khiến AVL tree thực hiện xoay trái-phải.
Các phép xoay AVL trong JavaScriptTrước tiên thực hiện xoay trái trên cây con trái của C. Điều này làm A thành cây con trái của B.
Các phép xoay AVL trong JavaScriptNút C vẫn mất cân bằng, tuy nhiên bây giờ là do cây con trái của cây con trái.
Các phép xoay AVL trong JavaScriptTa sẽ xoay phải cây, làm B thành gốc mới của cây con này. C giờ thành cây con phải của chính cây con trái của nó.
Các phép xoay AVL trong JavaScriptCây hiện đã cân bằng.

Đây cũng gọi là xoay LR vì ta xoay trái trước rồi xoay phải sau. Có thể triển khai dùng 2 phương thức trước như sau:

function rotationLR(node) {
  node.left = rotationRR(node.left);
  return rotationLL(node);
}

Xoay Phải-Trái (Right-Left Rotation)

Loại xoay kép thứ hai là Right-Left Rotation. Là kết hợp xoay phải theo sau bởi xoay trái.

Trạng tháiHành động
Các phép xoay AVL trong JavaScriptMột nút đã được chèn vào cây con trái của cây con phải. Điều này làm A, thành nút mất cân bằng với balance factor 2.
Các phép xoay AVL trong JavaScriptTrước tiên, thực hiện xoay phải dọc theo nút C, làm C thành cây con phải của chính cây con trái của nó B. Bây giờ, B thành cây con phải của A.
Các phép xoay AVL trong JavaScriptNút A vẫn mất cân bằng do cây con phải của cây con phải và cần xoay trái.
Các phép xoay AVL trong JavaScriptXoay trái được thực hiện bằng cách làm B thành gốc mới của cây con. A thành cây con trái của cây con phải B.
Các phép xoay AVL trong JavaScriptCây hiện đã cân bằng.

Đây cũng gọi là xoay RL vì ta xoay phải trước rồi xoay trái sau. Có thể triển khai dùng 2 phương thức trước như sau:

function rotationRL(node) {
  node.right = rotationLL(node.right);
  return rotationRR(node);
}