个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈
平衡二叉查:
平衡二叉树通常指一棵空树或左右两个子树的高度差的绝对值不超过1,并且任意节点的左右子树都是一棵平衡二叉树,即严格的平衡二叉树。平衡二叉树有多种实现方法:AVL树,红黑树,替罪羊树,伸展树,Treap等。
AVL树:
概念:
AVL树又称为高度平衡的二叉搜索树。它能保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度。
性质:
- 左子树和右子树的高度之差绝对值不超过1。
- 树中的每个左子树和右子树都是AVL树。
- 每一个节点都有一个平衡因子,任一节点的平衡因子是1、0、-1,平衡因子等于右子树的高度减去左子树的高度。
class AVLNode<T> {
T element;
AVLNode<T> left;
AVLNode<T> right;
int height;//记录高度
//构造器
public AVLNode(T theElement) {
this(theElement, null, null);
element = theElement;
}
public AVLNode(T theElement, AVLNode<T> left, AVLNode<T> right) {
this.element = theElement;
this.left = left;
this.right = right;
this.height = 0;
}
}
操作:
因为AVL树要求左右子树高度差绝对值不超过1,因此每次操作后,必须通过旋转来调节平衡因子,保持平衡。
插入:
AVL树的插入操作首先会按照普通二叉搜索树的插入操作进行。当插入数据后我们会按照插入时的所经过的节点回溯,回溯过程中,会判断每个节点的左子树高度和右子树高度的绝对值之差是否超过1。如果超过1,我们就需要通过旋转进行调整,调整的目的是使该节点满足AVL树的定义。
public void insert(T x) {
this.root = insert(x, root);
}
public AVLNode<T> insert(T x, AVLNode<T> t) {
if (t == null)//传入节点为空,则将该节点作为根节点返回
return new AVLNode<>(x, null, null);
int compareResult = x.compareTo(t.element);
if (compare