เพื่อปรับสมดุล AVL tree อาจทำ rotation 4 แบบ:
- Left rotation
- Right rotation
- Left-Right rotation
- Right-Left rotation
สองแบบแรกเป็น single rotations สองแบบถัดไปเป็น double rotations เพื่อให้มี unbalanced tree เราต้องมี tree สูงอย่างน้อย 2 ด้วย tree เรียบง่ายนี้ มาเข้าใจทีละแบบ:
Left Rotation
ถ้า tree ไม่สมดุลเมื่อ node ถูก insert เข้า right subtree ของ right subtree เราจะทำ single left rotation:

ในตัวอย่าง node A ไม่สมดุลเพราะมี node insert ใน right subtree ของ A's right subtree เราทำ left rotation โดยทำให้ A เป็น left-subtree ของ B Rotation นี้เรียกว่า LL rotation มาดูโค้ด:
function rotationLL(node) {
let tmp = node.left;
node.left = tmp.right;
tmp.right = node;
return tmp;
}
Right Rotation
AVL tree อาจไม่สมดุลถ้า node ถูก insert ใน left subtree ของ left subtree Tree ต้องการ right rotation

ตามภาพ unbalanced node กลายเป็น right child ของ left child โดย right rotation เรียกว่า RR rotation มาดูโค้ด:
function rotationRR(node) {
let tmp = node.right;
node.right = tmp.left;
tmp.left = node;
return tmp;
}
Left-Right Rotation
Double rotations เป็นเวอร์ชันซับซ้อนของ rotations ที่อธิบายไปแล้ว เพื่อเข้าใจดีกว่า ให้สังเกตแต่ละ action ขณะ rotation มาดู Left-Right rotation ก่อน Left-right rotation เป็นการรวม left rotation ตามด้วย right rotation
| State | Action |
|---|---|
![]() |
Node ถูก insert เข้า right subtree ของ left subtree ทำให้ C ไม่สมดุล สถานการณ์นี้ทำให้ AVL tree ทำ left-right rotation |
![]() |
เราทำ left rotation บน left subtree ของ C ก่อน ทำให้ A กลายเป็น left subtree ของ B |
![]() |
Node C ยังไม่สมดุล แต่ตอนนี้เป็นเพราะ left-subtree ของ left-subtree |
![]() |
เราทำ right-rotate ทำให้ B กลายเป็น root ใหม่ของ subtree นี้ C กลายเป็น right subtree ของ left subtree ของมันเอง |
![]() |
Tree สมดุลแล้ว |
เรียกว่า LR rotation เพราะทำ left rotation ก่อนแล้ว right rotation สามารถนำไปใช้ด้วยเมธอดก่อนหน้า 2 ตัวได้ดังนี้:
function rotationLR(node) {
node.left = rotationRR(node.left);
return rotationLL(node);
}
Right-Left Rotation
Double rotation ประเภทที่สองคือ Right-Left Rotation เป็นการรวม right rotation ตามด้วย left rotation
| State | Action |
|---|---|
![]() |
Node ถูก insert เข้า left subtree ของ right subtree ทำให้ A ไม่สมดุลกับ balance factor 2 |
![]() |
ก่อนอื่น ทำ right rotation ตาม C node ทำให้ C กลายเป็น right subtree ของ left subtree ของมันเอง B ตอนนี้ B กลายเป็น right subtree ของ A |
![]() |
Node A ยังไม่สมดุลเพราะ right subtree ของ right subtree ต้องการ left rotation |
![]() |
ทำ left rotation โดยทำให้ B เป็น root ใหม่ของ subtree A กลายเป็น left subtree ของ right subtree B |
![]() |
Tree สมดุลแล้ว |
เรียกว่า RL rotation เพราะทำ right rotation ก่อนแล้ว left rotation นำไปใช้ด้วยเมธอดก่อนหน้า 2 ตัวได้ดังนี้:
function rotationRL(node) {
node.right = rotationLL(node.right);
return rotationRR(node);
}








