数据结构 - (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


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

查看所有标签

猜你喜欢:

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

算法设计与分析

算法设计与分析

屈婉玲、刘田、张立昂、王捍贫 / 清华大学 / 2011-5 / 25.00元

《算法设计与分析》为计算机科学技术专业核心课程“算法设计与分析”教材.全书以算法设计技术和分析方法为主线来组织各知识单元,主要内容包括基础知识、分治策略、动态规划、贪心法、回溯与分支限界、算法分析与问题的计算复杂度、NP完全性、近似算法、随机算法、处理难解问题的策略等。书中突出对问题本身的分析和求解方法的阐述,从问题建模、算法设计与分析、改进措施等方面给出适当的建议,同时也简要介绍了计算复杂性理论......一起来看看 《算法设计与分析》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具