Untitled
unknown
plain_text
2 years ago
3.3 kB
10
Indexable
https://algs4.cs.princeton.edu/code/edu/princeton/cs/algs4/AVLTreeST.java.html
public class AVL {
public class Node {
private int data; // info
private int height; // height of the subtree
private int size; // number of nodes in subtree
private Node left; // left subtree
private Node right; // right subtree
public Node(int data, int height, int size, Node left, Node right) {
this.data = data;
this.height = height;
this.size = size;
this.left = left;
this.right = right;
}
}
Node root;
public boolean isEmpty() {
return root == null;
}
// size
public int size(Node x) {
return x == null ? 0 : x.size;
}
public int size() {
return size(root);
}
// lấy chiều cao
private int height(Node x) {
if (x == null) return -1;
return x.height;
}
public int height() {
return height(root);
}
// Search + check if present
private Node get(Node x, int data) {
if (x == null) return null;
int cmp = Integer.compare(data, x.data);
if (cmp < 0) return get(x.left, data);
else if (cmp > 0) return get(x.right, data);
else return x;
}
public boolean contains(int data) {
return get(root,data) != null;
}
// Tìm hệ số cân bằng
private int balanceFactor(Node x) {
return height(x.left) - height(x.right);
}
// Quay trái:
/*
* 3 6
* * ---> * *
* 6 3 9
* * * *
* 5 9 5
* */
private Node rotateLeft(Node top) {
Node mid = top.right;
top.right = mid.left;
mid.left = top;
mid.size = top.size;
top.size = 1 + size(top.left) + size(top.right);
top.height = 1 + Math.max(height(top.left), height(top.right));
mid.height = 1 + Math.max(height(mid.left), height(mid.right));
return mid;
}
// Quay phải: ngược lại
private Node rotateRight(Node top) {
Node mid = top.left;
top.left = mid.right;
mid.right = top;
mid.size = top.size;
top.size = 1 + size(top.left) + size(top.right);
top.height = 1 + Math.max(height(top.left), height(top.right));
mid.height = 1 + Math.max(height(mid.left), height(mid.right));
return mid;
}
// Cây cân bằng khi hiệu chiều cao 2 chị em tối đa là 1 -> sai thì xoay: 4 trường hợp:
private Node balance(Node x) {
// hiệu < -1 (3-5) ~ cây nghiêng phải: Right -> Right-Right + Right-Left
if (balanceFactor(x) < -1) {
if (balanceFactor(x.right) > 0) {
x.right = rotateRight(x.right);
}
x = rotateLeft(x);
}
// hiệu > 1 (5-3) ~ cây nghiêng trái: Left -> Left - right + left - left
else if (balanceFactor(x) > 1) {
if (balanceFactor(x.left) < 0) {
x.left = rotateLeft(x.left);
}
x = rotateRight(x);
}
return x;
}
}
Editor is loading...