慕课网liuyubobobo老师课程学习笔记---part11:AVL

本文介绍了AVL树作为平衡二叉搜索树的特性,重点阐述了旋转操作的原理,包括LR与RL的不平衡情况,并探讨了AVL树在删除元素时如何保持平衡。同时,展示了AVL树在集合与映射中的高效性能,其添加和删除操作的时间复杂度为O(logn),避免了退化为链表的风险。
摘要由CSDN通过智能技术生成

1、平衡二叉树和AVL树

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、旋转操作的基本原理
  下面介绍的是AVL树实现自平衡的机制!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、LR与RL的不平衡情况

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、AVL树的删除
  AVL树中添加元素可能导致整棵树变得不平衡,删除某个元素也是一样的,可能使得整棵树变得不平衡!
在这里插入图片描述
  AVL树相应的代码如下:

package com.lkj;

import java.util.ArrayList;

/**
AVL平衡二叉树其实就是在之前的二分搜索树的基础上实现的,其实就是在二分搜索树的基础上添加上自平衡的机制,
 使得二分搜索树在堆结点进行操作的时候,可以保证整棵树是平衡的(即每一个结点左右子树的高度差不超过1),不会退化。
 */
public class AVLTree<K extends Comparable<K>, V> {
   

    private class Node{
   
        public K key;
        public V value;
        public Node left, right;
        public int height;//记录每一个结点的高度值

        public Node(K key, V value){
   
            this.key = key;
            this.value = value;
            left = null;
            right = null;
            height = 1;//结点都是添加到叶子结点处,因此每一个结点初始化的时候,高度值都是1
        }
    }

    private Node root;
    private int size;

    public AVLTree(){
   
        root = null;
        size = 0;
    }
//---------------------------------------------------------------------------------新增的辅助方法
    //辅助函数,返回每一个结点的高度值(主要是为了处理结点为null的情况,后面就不需要判断结点为null的情况)
    private int getHeight(Node node)
    {
   
        if(node == null)
            return 0;//空结点的高度为0
        return node.height;
    }

    //辅助函数:计算结点的平衡因子
    private int getBalanceFactor(Node node)
    {
   
        if(node == null)
            return 0;
        return getHeight(node.left) - getHeight(node.right);//左子树的高度减去右子树的高度
    }

    /** AVL 树既要满足平衡二叉树的特性(所有结点左右子树高度差小于1),又要满足二分搜索树的特性
     * (AVL树是改进二分搜索树,引入平衡因子,使得二分搜索树不会退化为链表) */

    // 判断该二叉树是否是一棵二分搜索树(利用二分搜索树中序遍历是升序的机制)
    private boolean isBST()
    {
   
        ArrayList<K> keys = new ArrayList<>();//用于存储所有结点的key
        inOrder(root , keys);//利用中序遍历,将以root为根的树的所有结点添加到keys中

        for (int i = 1; i < keys.size(); i++)
        {
   
            if(keys.get(i-1).compareTo(keys.get(i)) > 0)//如果中序遍历后keys的key中不是升序,则该树不是二分搜索树
                return false;
        }
        return true;
    }
    //中序遍历的方法
    private void inOrder(Node node , ArrayList<K> keys
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值