- 上篇介绍了二叉搜索树 这篇介绍下平衡二叉搜索树 是建立在二叉搜索树的基础之上
- 当我们依次添加 从小到大的数据的时候 这个时候二叉搜索树会蜕化为链表
- 当我们新增或者删除的时候 也可能会退化为链表
有一个平衡的概念 就是左右子树的高度差尽量小
- 我们可以在添加或者删除的时候 去旋转节点使得树保持平衡,用尽量少的调转次数使树保持平衡,一棵达到适度平衡的二叉搜索树 我们称之为平衡二叉树
- 我们常见的平衡二叉树 有 avl树 和 红黑树 接下来上平衡二叉树的代码
- 提供了旋转的方法
public class BBST<E> extends BST<E> {
public BBST() {
this(null);
}
public BBST(Comparator<E> comparator) {
super(comparator);
}
protected void rotateLeft(Node<E> grand) {
Node<E> parent = grand.right;
Node<E> child = parent.left;
grand.right = child;
parent.left = grand;
afterRotate(grand, parent, child);
}
protected void rotateRight(Node<E> grand) {
Node<E> parent = grand.left;
Node<E> child = parent.right;
grand.left = child;
parent.right = grand;
afterRotate(grand, parent, child);
}
protected void afterRotate(Node<E> grand, Node<E> parent, Node<E> child) {
// 让parent称为子树的根节点
parent.parent = grand.parent;
if (grand.isLeftChild()) {
grand.parent.left = parent;
} else if (grand.isRightChild()) {
grand.parent.right = parent;
} else { // grand是root节点
root = parent;
}
// 更新child的parent
if (child != null) {
child.parent = grand;
}
// 更新grand的parent
grand.parent = parent;
}
protected void rotate(
Node<E> r, // 子树的根节点
Node<E> b, Node<E> c,
Node<E> d,
Node<E> e, Node<E> f) {
// 让d成为这棵子树的根节点
d.parent = r.parent;
if (r.isLeftChild()) {
r.parent.left = d;
} else if (r.isRightChild()) {
r.parent.right = d;
} else {
root = d;
}
//b-c
b.right = c;
if (c != null) {
c.parent = b;
}
// e-f
f.left = e;
if (e != null) {
e.parent = f;
}
// b-d-f
d.left = b;
d.right = f;
b.parent = d;
f.parent = d;
}
}