数据结构 - (AVL)平衡二叉树

栏目: 编程工具 · 发布时间: 6年前

内容简介:AVL树本质上还是二叉树,但是比二叉搜索树多了一个条件:每个节点的左右子树高度不超过1因为二叉搜索树在极端情况下无限趋近于链表,这种情况下不能体现二叉搜索树的高效率。如下图

AVL树本质上还是二叉树,但是比二叉搜索树多了一个条件:每个节点的左右子树高度不超过1

因为二叉搜索树在极端情况下无限趋近于链表,这种情况下不能体现二叉搜索树的高效率。如下图

数据结构 - (AVL)平衡二叉树

{
     Node<T> root;
    
    {
         T key;
         Node<T> left;
         Node<T> right;


        {
            .key = key;
        }
    }
}
{
     height(root);
}

{
    ;
     {
        ;
    }
}

AVL树在添加或者删除后,可能导致AVL树失去平衡。

失去平衡包括四种:LL(左左),LR(左右),RR(右右),RL(右左),具体参考下图

数据结构 - (AVL)平衡二叉树

数据结构 - (AVL)平衡二叉树

数据结构 - (AVL)平衡二叉树

旋转方式:将k1变成根节点,k2变成k1的右子树,"k1的右子树"变成"k2的左子树"

/**
* 左左旋转
* @param tree
* @return
*/
> tree){
 ;
 tree.;
 lTree. = tree;
  lTree;
}

数据结构 - (AVL)平衡二叉树

旋转方式:旋转方式与LL旋转类似

/**
 * 右右旋转
 * @param tree
 * @return
 */
> tree){
    ;
    tree.;
    rTree. = tree;
     rTree;
}

数据结构 - (AVL)平衡二叉树

旋转方式:左右旋转需要经过两次调整,第一次旋转是围绕"k1"进行的"RR旋转",第二次是围绕"k3"进行的"LL旋转"

/**
 * 左右旋转
 *  tree
 * 
 */
{
    rrRotation(tree.left);
     llRotation(tree);
}

数据结构 - (AVL)平衡二叉树

旋转方式:右左旋转同样需要经过两次调整,第一次旋转是围绕"k3"进行的"LL旋转",第二次是围绕"k1"进行的"RR旋转"

/**
 * 右右旋转
 *  tree
 * 
 */
{
    llRotation(tree.right);
     rrRotation(tree);
}
{
    ){
        root =  Node<>(key);
    } {
        
        root = fixAfterOperation(root);
    }
}

{
     tmp;
    ){
        tree =  Node<>(key);
    } {
        tmp = key.compareTo(tree.key);
        ){
            tree.left = (tree.left,key);
        }){
            tree.right = (tree.right,key);
        } {
             tree;
        }
    }
     tree;
}

当树添加或者删除某一节点后,如果导致AVL树失衡,旋转树

> tree) {
     (tree != null) {
        
            
                tree = llRotation(tree);
            } 
                tree = lrRotation(tree);
            }

        }

        
            
                tree = rlRotation(tree);
            }  {
                tree =rrRotation(tree);
            }
        }
    }
     tree;
}
{
    ){
        (root,key);
        root = fixAfterOperation(root);
    }
}

{
     tree;
     tmp = key.compareTo(tree.key);
    ){
        tree.left = (tree.left,key);
    }){
        tree.right = (tree.right,key);
    } {
            Node<T> successor = successor(tree);
            
                Node<T> l = tree.left;
                
                    tree = ;
                }
                    tree.key = l.key;
                    tree.left = (tree.left,l.key);
                }
            }
                tree.key = successor.key;
                tree.right = (tree.right,successor.key);
            }
    }
     tree;
}


{
    Node<T> result = tree.right;
    ){
        result = result.left;
    }
     result;
}

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2019-03/157249.htm


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

软件测试

软件测试

乔根森 / 韩柯 / 机械工业出版社 / 2003-12-1 / 35.00元

《软件测试》(原书第2版)全面地介绍了软件测试的基础知识和方法。通过问题、图表和案例研究,对软件测试数学问题和技术进行了深入的研究,并在例子中以更加通用的伪代码取代了过时的Pascal代码,从而使内容独立于具体的程序设计语言。《软件测试》(原书第2版)还介绍了面向对象测试的内容,并完善了GUI测试内容。一起来看看 《软件测试》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具