一.简介
排序二叉树有可能是一颗只有左子树或右子树,这样将严重降低排序二叉树的优势。
AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。
1.本身首先是一棵二叉搜索树。
2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。
二.实现
新增/删除节点后导致的局部不平衡,通过旋转使树满足平衡。
不平衡类型:
1.LL型:LL的意思是向左子树(L)的左孩子(L)中插入新节点后导致不平衡
右旋转
2.RR型: RR的意思是向右子树(R)的右孩子(R)中插入新节点后导致不平衡
左旋转
3.LR型: LR的意思是向左子树(L)的右孩子(R)中插入新节点后导致不平衡
左旋转——右旋转
4.RL型: RL的意思是向右子树(R)的左孩子(L)中插入新节点后导致不平衡
右旋转——左旋转
添加/删除时从添加节点/删除节点向父节点回溯调整平衡
package com.vincent;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BinSortTree<Integer> tree = new BinSortTree<>();
for(Integer data : Arrays.asList(4,3,6,5,7,8,9,10)){
tree.add(data);
System.out.println(tree.getRoot());
}
System.out.println();
List<Integer> list = tree.infixList();
System.out.println(list);
}
}
//二叉排序树(BST)
class BinSortTree<T extends Comparable<T>>{
static class Node<T extends Comparable<T>> {
private T item;
private Node<T> left;
private Node<T> right;
private Node<T> parent;
public Node(T item) {
this.item = item;
}
public T getItem(){
return item;
}
/**
* 添加节点到当前节点下
* @param node 添加的节点
*/
public void add(Node<T> node){
if(node.item.compareTo(this.item) <= 0){
if(this.left == null){
this.left = node;
node.parent = this;
}
else{
this.left.add(node);
}
}
else{
if(this.right == null){
this.right = node;
node.parent = this;
}
else