平衡二叉树(AVL)

一.简介

排序二叉树有可能是一颗只有左子树或右子树,这样将严重降低排序二叉树的优势。

在这里插入图片描述

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
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值