伸展树&红黑树&AVL树总结

最近学习了这3种树,感觉其实有很多相同的地方吧,首先是最重要的旋转操作,3种树都有

AvlTree left_left(AvlTree k1)
{
    //if(height(k1->left)-height(k1->right)<2)return k1;
    AvlTree k2 = k1->left;
    k1->left = k2->right;
    k2->right = k1;
   k1->Height = max(height(k1->left),height(k1->right))+1;
    k2->Height = max(height(k2->left),height(k2->right))+1;
    return k2;
}

//右右旋转

AvlTree right_right(AvlTree k1)
{
    //if(height(k1->right)-height(k1->left)<2)return k1;
    AvlTree k2 = k1->right;
    k1->right = k2->left;
    k2->left = k1;
    k1->Height = max(height(k1->left),height(k1->right))+1;
    k2->Height = max(height(k2->left),height(k2->right))+1;
    return k2;
}

(我的左旋是指自身是左而父亲也是左时的旋转而不是向左旋转,和网上的大部分不同)功能也都差不多一样,AVL树是直接用来保持树的高度平衡性,而在伸展树中,其实旋转操作与把要查找的节点移到头结点并没有太大关系(我的写法中,还有另一种旋转方法则有直接关系),伸展树在一次查询中最坏的情况可能是O(n),而旋转操作可以保证连续n次旋转复杂度为nlg(n),也就是说在伸展树中,旋转也是来改变树的深度的,在红黑树中,旋转就要再添加些代码了,因为红黑树中还有父亲节点,所以要添加旋转的时候父亲节点发生的改变,而旋转操作主要是为了满足到叶子节点的黑色节点数相同这一性质,其实也就是在减小树的深度。

template <class T>
red_black_node<T>* red_black_tree<T>::RotateRight(red_black_node<T>* node,red_black_node<T>* root)
{

    red_black_node<T>* tem = node->right;
    node->right = tem->left;
    tem->left = node;
    tem->parent = node->parent;
    node->parent = tem;
    if(node->right!=NULL)
    node->right->parent = node;

    if(tem->parent==NULL)
    {
        root = tem;
    }
    else
    {
        if(tem->parent->key > tem->key)
        {
            tem->parent->left = tem;
            //red_black_tree<T>::Travel_it(root);
        }
        else
        {
            tem->parent->right = tem;
        }

    }
    return root;
}

//左旋函数,并未改变颜色
template <class T>
red_black_node<T>* red_black_tree<T>::RotateLeft(red_black_node<T>* node,red_black_node<T>* root)
{
    red_black_node<T>* tem = node->left;
    node->left = tem->right;
    tem->right = node;
    tem->parent = node->parent;
    node->parent = tem;
    if(node->left!=NULL)
    node->left->parent = node;

    if(tem->parent==NULL)
    {
        root = tem;
    }
    else
    {
        if(tem->key > tem->parent->key)
        {
            tem->parent->right = tem;
        }
        else
        {
            tem->parent->left = tem;
        }
    }
    return root;
}

另外就是在删除时AVL树和红黑树都是寻找删除节点的右儿子的最左孩子来替代(当然是存在的情况下),然后进行树的重新平衡,AVL树是旋转然后节点高度的更新,红黑树则是旋转,颜色的重绘。相比而言伸展树的删除就方便多了,因为它用到了它在将寻找节点移到根节点时的特殊操作,可以很轻松的实现删除操作。

还有想说的就是关于AVL树与红黑树的性能比较,说句实话我还未没感觉到红黑树比AVL树的操作优化多少,只是红黑树确实在删除和插入时可能会快些。我只明显感觉到红黑树比AVL树复杂太多太多。。。可能是我太菜的缘故吧。。。

时间: 2024-10-13 12:33:48

伸展树&红黑树&AVL树总结的相关文章

浅谈AVL树,红黑树,B树,B+树原理及应用

背景:这几天在看<高性能Mysql>,在看到创建高性能的索引,书上说mysql的存储引擎InnoDB采用的索引类型是B+Tree,那么,大家有没有产生这样一个疑问,对于数据索引,为什么要使用B+Tree这种数据结构,和其它树相比,它能体现的优点在哪里? 看完这篇文章你就会了解到这些数据结构的原理以及它们各自的应用场景. 二叉查找树 简介 二叉查找树也称为有序二叉查找树,满足二叉查找树的一般性质,是指一棵空树具有如下性质: 任意节点左子树不为空,则左子树的值均小于根节点的值. 任意节点右子树不为

霍夫曼树 二三树 红黑树 B树 B+树

霍夫曼树: 特点:带权路径长度最短,∑(每个节点的权重)*(每个节点的层数) 生成:每次合并权值最小的两个节点(子树)建立二叉树,将合并后的子树作为新节点,权值为节点(子树)权值之和 二三树: 特点:平衡查找树,每个叶子节点为空且层数相同,查找时间复杂度O(lgn) 生成:2节点包含一个key和两个子节点(left->key<key<right->key),3节点包含两个key和三个子节点(left->key<key1<middle->key<key2

平衡二叉搜索树(AVL树,红黑树)数据结构和区别

平衡二叉搜索树(Balanced Binary Search Tree) 经典常见的自平衡的二叉搜索树(Self-balancing Binary Search Tree)有 ① AVL树 :Windows NT 内核中广泛使用 ② 红黑树:C++ STL(比如 map.set )Java 的 TreeMap.TreeSet.HashMap.HashSet  Linux 的进程调度  Ngix 的 timer 管理 1 AVL树  vs  红黑树 ①AVL树 平衡标准比较严格:每个左右子树的高度

查找二,二叉树查找与2-3树红黑树

BST: 每个节点的键,都大于其左自述中的任意节点的键,而小于有字数的任意结点的键. 部分实现 get(Node x , Key key){ if(x == null) return null; cmp = key.compareTo(x.key); if(cmp<0) retrun get(x.right,key); else if(cmp>0) retrun get(x.left,key); else return x.val; } 2-3树红黑树: 属于平衡查找树,为了希望保持二分查找树

《树》之AVL树

本文简介: AVL树的简单介绍 AVL树几种实现方法的对比 AVL树删除节点的分析 AVL树插入节点的分析 AVL树ADT的简单实现 一.简介 定义:    AVL(Adlson-Velskii和Landis)树是带有平衡条件的二查查找树.对于AVL树来说,其平衡条件有两点限制: ⑴易于保持; ⑵保证树的深度为O(log N). 二.AVL树几种实现方法的对比 几种平衡条件的讨论 ⑴树上每个节点都必须要有相同高度的左子树和右子树: 在该平衡条件下,记根节点的高度为0,则高度为K的AVL树,其节点

红黑树/B+树/AVL树

RB Tree 红黑树  :http://blog.csdn.net/very_2/article/details/5722682 AVL Tree    :http://blog.csdn.net/collonn/article/details/20128205 B[+/-] Tree  :http://hxraid.iteye.com/blog/611105 几种Tree 总结对比 :http://www.iteye.com/topic/614070 [nginx模块开发与架构解析]

数据结构学习笔记-排序/队/栈/链/堆/查找树/红黑树

排序: 插入排序:每次从剩余数据中选取一个最小的,插入已经排序完成的序列中 合并排序:将数据分成左右两组分别排序,然后合并,对每组数据的排序递归处理. 冒泡排序:重复交换两个相邻元素,从a[1]开始向a[0]方向冒泡,然后a[2]...当a[i]无法继续往前挤的时候说明前面的更小了,而且越往前越小(挤得越往前) 堆排序:构造最大堆,每次取走根结点(自然是最大的),再调用MAX-HEAPIFY算法(见后文的堆)恢复最大堆的性质,重复取走根结点 快速排序(对A[r]-A[n]进行排序): 1.从序列

数据结构--树--红黑树

R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black). 红黑树的特性:(1)每个节点或者是黑色,或者是红色.(2)根节点是黑色.(3)每个叶子节点(NIL)是黑色. [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!](4)如果一个节点是红色的,则它的子节点必须是黑色的.(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点.

树-红黑树(R-B Tree)

红黑树概念 特殊的二叉查找树,每个节点上都有存储位表示节点的颜色是红(Red)或黑(Black).时间复杂度是O(lgn),效率高. 特性: (1)每个节点或者是黑色,或者是红色. (2)根节点是黑色. (3)每个叶子节点(NIL)是黑色.(只为空(NIL或null)的节点) (4)如果一个节点是红色的,则它的子节点必须是黑色的.(黑结点可连续,红结点不能连续) (5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点. 定理:一棵含有n个节点的红黑树的高度至多为2log(n+1).