数据结构--AVL树的insert()的Java实现

一个AVL树是其每个节点的左子树和右子树的高度差最多差1的二叉查找树;AVL树是一种最古老的平衡查找树

上代码:

package com.itany.avlshu;

public class AVLTree<T extends Comparable<?super T>>
{
    private static class AvlNode<T>
    {
        private int height;
        private T element;
        private AvlNode<T> left;
        private AvlNode<T> right;
        public AvlNode(T element)
        {
            this(element,null,null);
        }
        public AvlNode(T element,AvlNode<T> left,AvlNode right)
        {
            this.element=element;
            this.left=left;
            this.right=right;
            height=0;
        }
    }
    private int height(AvlNode<T> node)
    {
        return (node==null)?-1:node.height;
    }
    private int compare(T x, T element)
    {
        return x.compareTo(element);
    }
    private AvlNode<T> insert(T x,AvlNode<T> t)
    {
        if(t==null)
            return new AvlNode<T>(x,null,null);//创造出来时 默认height=0
        int compareResult=compare(x,t.element);
        if(compareResult<0)
        {
            t.left=insert(x,t.left);
            //做完了插入之后 立马比较t的左右儿子的高度差是否等于2 若是 则进行相应旋转 若不是那么下一步  直接更新这个t的height值
            //此时左边儿子高度比较大
            if(height(t.left)-height(t.right)==2)

            {
                //下面分两种旋转情况 一种是单旋转 另一种是双旋转
                if(compare(x,t.left.element)<0)
                    t=rotateWithLeftChild(t);
                else
                    t=doubleRotateWithLeftChild(t);
            }
        }
        else if(compareResult>0)
        {
            t.right=insert(x,t.right);
            //做完了插入之后 立马比较t的左右儿子的高度差是否等于2 若是 则进行相应旋转 若不是那么下一步  直接更新这个t的height值
            //此时右边儿子高度比较大
            if(height(t.right)-height(t.left)==2)
            {
                //下面分两种旋转情况 一种是单旋转 另一种是双旋转
                if(compare(x,t.right.element)<0)
                    t=doubleRotateWithRightChild(t);
                else
                    t=rotateWithRightChild(t);
            }
        }
        else
            ;
        t.height=Math.max(height(t.left), height(t.right))+1;//+1是加一个自己
        return t;
    }
    private AvlNode<T> rotateWithRightChild(AvlNode<T> k1)
    {
        AvlNode<T> k2=k1.right;
        k1.right=k2.left;
        k2.left=k1;
        k2.height=Math.max(height(k2.left),height(k2.right))+1;
        k1.height=Math.max(height(k1.left),height(k1.right))+1;
        return k2;
    }
    private AvlNode<T> doubleRotateWithRightChild(AvlNode<T> k3)
    {
        k3.right=rotateWithLeftChild(k3.right);
        return rotateWithRightChild(k3);
    }
    //双旋转是由两次单旋转得来
    private AvlNode<T> doubleRotateWithLeftChild(AvlNode<T> k3)
    {
        k3.left=rotateWithRightChild(k3.left);
        return rotateWithLeftChild(k3);
    }
    private AvlNode<T> rotateWithLeftChild(AvlNode<T> k2)
    {
        AvlNode<T> k1=k2.left;
        k2.left=k1.right;
        k1.right=k2;
        k2.height=Math.max(height(k2.left),height(k2.right))+1;
        k1.height=Math.max(height(k1.left),height(k1.right))+1;
        return k1;
    }

}
时间: 2024-11-06 12:35:41

数据结构--AVL树的insert()的Java实现的相关文章

AVL树-自平衡二叉查找树(Java实现)

在计算机科学中,AVL树是最先发明的自平衡二叉查找树.AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在 1962 年的论文 "An algorithm for the organization of information" 中发表了它. 一.AVL树的旋转规律 AVL树的基本操作一般涉及运做同在不平衡的二叉查找树所运做的同样的算法.但是要进行预先或随后做一次或多次所谓的"AVL旋转". 假设由于在二叉排序树上插入

JAVA数据结构--AVL树的实现

AVL树的定义 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度都是.增加和删除可能需要通过一次或多次树旋转来重新平衡这个树.AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis,他们在1962年的论文<An algorithm for the organization of information>中发表了它. 节点的平衡因子是

数据结构--AVL树

AVL树是高度平衡的二叉搜索树,较搜索树而言降低了树的高度:时间复杂度减少了使其搜索起来更方便: 1.性质: (1)左子树和右子树高度之差绝对值不超过1: (2)树中每个左子树和右子树都必须为AVL树: (3)每一个节点都有一个平衡因子(-1,0,1:右子树-左子树) (4)遍历一个二叉搜索树可以得到一个递增的有序序列 2.结构: 平衡二叉树是对二叉搜索树(又称为二叉排序树)的一种改进.二叉搜索树有一个缺点就是,树的结构是无法预料的.任意性非常大.它仅仅与节点的值和插入的顺序有关系.往往得到的是

数据结构--Avl树的创建,插入的递归版本和非递归版本,删除等操作

AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树. 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值最多为1(空树的高度为-1). 也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树). 对Avl树进行相关的操作最重要的是要保持Avl树的平衡条件.即对Avl树进行相关的操作后,要进行相应的旋转操作来恢复Avl树的平衡条件. 对Avl树的插入和删除都可以用递归实现,文中也给出了插入的非递归版本,关键在于要用到栈. 代码如下: #inclu

数据结构&amp;&amp;AVL树原理、插入操作详解及实现

1.基本概念 AVL树的复杂程度真是比二叉搜索树高了整整一个数量级--它的原理并不难弄懂,但要把它用代码实现出来还真的有点费脑筋.下面我们来看看: 2.AVL树是什么? AVL树本质上还是一棵二叉搜索树(因此读者可以看到我后面的代码是继承自二叉搜索树的),它的特点是: 1. 本身首先是一棵二叉搜索树. 2. 带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1. 例如: 5              5 / \            / \ 2   6          2  

简单数据结构———AVL树

C - 万恶的二叉树 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2193 Description An AVL tree is a kind of balanced binary search tree. Named after their invento

[数据结构] AVL树和AVL旋转、哈夫曼树和哈夫曼编码

1. AVL树 AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增加和删除可能需要通过一次或多次树旋转来重新平衡这个树. 节点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反).带有平衡因子1.0或 -1的节点被认为是平衡的.带有平衡因子 -2或2的节点被认为是不平衡的,并需要重新平衡这个树.平衡因子可以直接存储在每个节点中,或从可能存储在节点中的子树高度计算出来. 1.2AVL旋转 AVL树的基本操作一

再回首数据结构—AVL树(二)

前面主要介绍了AVL的基本概念与结构,下面开始详细介绍AVL的实现细节: AVL树实现的关键点 AVL树与二叉搜索树结构类似,但又有些细微的区别,从上面AVL树的介绍我们知道它需要维护其左右节点平衡,实现AVL树关键在于标注节点高度.计算平衡因子.维护左右子树平衡这三点,下面分别介绍: 标注节点高度 从上面AVL树的定义中我们知道AVL树其左右节点高度差不能超过一,所以我们需要标注出每个节点高度: 1.节点高度为最大的子节点高度加1,其中叶子节点高度为1: 2.1与4叶子节点高度为1,节点3高度

自己动手实现数据结构——AVL树(C++实现)

这类教程有很多了,就用C++简单实现下以供记录和参考,以后再有补充版本. 实现了查找和插入.删除操作有些复杂,感觉个人实现的效率不是很高,以后再补充,先把做过的东西记录下来. Avl.h #ifndef __AVL_H #define __AVL_H #include<stddef.h> #include<vector> template< class T> struct AvlNode{ T data; int height; AvlNode* left; AvlNo