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

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

内容简介: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


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

查看所有标签

猜你喜欢:

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

技术赋权

技术赋权

郑永年 / 邱道隆 / 东方出版社 / 2014-4-1 / CNY 45.00

在本书中,作者对中国互联网的历史做了一次突破性的研究,细致又全面地观察了中国互联网对于国家和社会的影响,发现互联网给中国的社会—政治变革带来了新的动力。政府权力和社会力量在以互联网为媒介的公共领域中转换。 从大量的数据梳理和事实分析中,作者得出了四重的研究结论。首先,互联网给政府和社会都增加了权力。互联网在促进政治自由化中扮演了重要的角色,使政府更加开放、透明和负责任。第二,互联网产生了大量......一起来看看 《技术赋权》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

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

HEX HSV 互换工具