平衡二叉树(AVL树)
基本介绍:
1.平衡二叉树也叫平衡二叉树搜索树又被称为AVL树,可以保证查询效率较高。
2.具有一下特点:它是一棵空树或它的左右两个子树的高度差绝对值不超过1,并且左右两个子树都是一颗平衡二叉树,平衡为叉树的常用实现方法有红黑树,AVL,替罪羊树,Treap,伸展树等。
求树的高度
//返回左子树高度
public int leftHeight(){
if (this.left == null){
return 0;
}
return this.left.height();
}
//返回右子树高度
public int rightHeight(){
if (this.right == null){
return 0;
}
return this.right.height();
}
//当前节点的高度
public int height(){
return Math.max(this.left == null ? 0 : this.left.height(), this.right == null ? 0 : this.right.height()) + 1;
}
左旋转
代码实现如下:
private void leftRotate(){
//创建新节点,以当前根节点的值
Node newNode = new Node(this.value);
//把新节点的左子树设置成当前节点的左子树
newNode.left = this.left;
//把新节点的右子树设置为当前节点的右子树的左子树
newNode.right = this.right.left;
//把当前节点的值替换成右子树节点的值
this.value = this.right.value;
//把当前节点的右子树设置成右子树的右子树
this.right = this.right.right;
//把当前的节点的左子树设置成新的节点
this.left = newNode;
}
右旋转:
代码如下:
//右旋转
private void rightRotate(){
Node newNode = new Node(this.value);
newNode.right = this.right;
newNode.left = this.left.right;
this.value = left.value;
this.left = this.left.left;
this.right = newNode;
}
平衡二叉树添加节点:
//递归添加节点
public void add(Node node){
if (node == null){
return;
}
if (node.value < this.value){
if (this.left == null){
this.left = node;
} else {
this.left.add(node);
}
} else {
if (this.right == null){
this.right = node;
} else {
this.right.add(node);
}
}
//添加完了,判断是否右子树-左子树>1,左旋转
if (rightHeight() - leftHeight() > 1){
if (right != null && this.left.leftHeight() > this.right.rightHeight()){
this.rightRotate();
leftRotate();
} else {
leftRotate();
}
return;
}
//添加完一个节点后,如果左子树-右子树>1
if (leftHeight() - rightHeight() > 1){
//如果它的左子树的右子树高度大于它的左子树高度
if (left != null && this.left.rightHeight() > this.left.leftHeight()){
this.left.leftRotate();
rightRotate();
} else {
rightRotate();
}
}
}
ps:【源码自取,点击即可】
ps:以上笔记均来自尚硅谷韩顺平老师《Java数据结构与java算法》