20120920-AVL树定义《数据结构与算法分析》

AVL树节点声明:

1 struct AvlNode
2 {
3     Comparable element;
4     AvlNode *left;
5     AvlNode  *right;
6     int height;
7
8     AvlNode( const Comparable & theElement,AvlNode *lt,AvlNode *rt,int h=0):element ( theElement),left(lt),right(rt),height(t)
9 };

计算节点高度:

1 int height( AvlNode * t) const
2 {
3     return t == NULL ? -1 : t->height;
4 }

向AVL中插入操作:

void insert( const Comparable & x,AvlNode * & t)
{
    if(t == NULL)
        t = new AvlNode ( x,NULL,NULL);
    else if (x < t->element);
    {
        insert( x ,t->left);
        if(height(t->left)-height(t->right) == 2)
            if(x < t->element)
                rotateWithLeftChild(t);
            else
                doubleWithLeftChild(t);
    }
    else if (t->element < x)
    {
        insert(x,t->right);
        if(height(t->right) - height(t->left) == 2)
            if(t->right->element < x)
                rotateWithLeftChild(t);
            else
                doubleWithLeftChild(t);
    }
    else
        ;
    t->height = max(height(t->left),height(t->right))+1;
}

执行单旋转过程:

1 void rotateWithLeftChild(AvlNode * & k2)
2 {
3     AvlNode *k1 = k2->left;
4     k2->left = k1->right;
5     k1->right = k2;
6     k2->height = max(height(k2->left),height(k2->right))+1;
7     k1->height = max(height(k1->left),height(k1->right))+1;
8     k2=k1;
9 }

执行双旋转过程:

void doubleWithLeftChild( AvlNode * & k3)
{
    rotateWithLeftChild(k3->left);
    rotateWithLeftChild(k3);
}

本文转自博客园xingoo的博客,原文链接:20120920-AVL树定义《数据结构与算法分析》,如需转载请自行联系原博主。

时间: 2024-09-24 13:01:01

20120920-AVL树定义《数据结构与算法分析》的相关文章

二叉树学习笔记之经典平衡二叉树(AVL树)

二叉查找树(BSTree)中进行查找.插入和删除操作的时间复杂度都是O(h),其中h为树的高度.BST的高度直接影响到操作实现的性能,最坏情况下,二叉查找树会退化成一个单链表,比如插入的节点序列本身就有序,这时候性能会下降到O(n).可见在树的规模固定的前提下,BST的高度越低越好. 平衡二叉树 平衡二叉树是计算机科学中的一类改进的二叉查找树. 平衡二叉树具有以下性质: (1)一棵空树是平衡二叉树 (2)如果树不为空,它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.

Python数据结构——AVL树的实现

既然,我们已经证明,保持 AVL 树的平衡将会使性能得到很大的提升,那我们看看如何在程序中向树插入一个新的键值.因为所有的新键是作为叶节点插入树的,而新叶子的平衡因子为零,所以我们对新插入的节点不作调整.不过一旦有新叶子的插入我们必须更新其父节点的平衡因子.新叶子会如何影响父节点的平衡因子取决于叶节点是左子节点还是右子节点.如果新节点是右子节点,父节点的平衡因子减 1.如果新节点是左子节点,父节点的平衡因子将加 1.这种关系可以递归地应用于新节点的前两个节点,并有可能影响到之前的每一个甚至是根节

数据结构之AVL树详解_C 语言

1. 概述 AVL树是最早提出的自平衡二叉树,在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis.AVL树种查找.插入和删除在平均和最坏情况下都是O(log n),增加和删除可能需要通过一次或多次树旋转来重新平衡这个树.本文介绍了AVL树的设计思想和基本操作. 2. 基本术语 有四种种情况可能导致二叉查找树不平衡,分别为: (1)LL:插入一个新节点到根节点的左子树(Left)的左子树

20120918-LIST类定义《数据结构与算法分析》

LIST类结构 1 template <typename Object> 2 class List 3 { 4 private: 5 struct Node//所有都是公有的 6 { 7 Object data; 8 Node *prev; 9 Node *next; 10 11 Node(const Object & d = Object(),Node *p = NUll,Node *n = Null): 12 data(d) , prev(p) , next(n) 13 { 14

20120918-双向链表类定义《数据结构与算法分析》

将新的节点插入双向链表的时候: iterator insert(iterator itr,const Object & x)//向双向链表中插入一个x节点 { Node *p = itr.current; theSize++; return iterator(p->prev = p->prev->next = new Node(x,p->prev,p)); } LIST类的删除节点的过程: //删除双向链表中的一个节点 iterator erase(iterator itr

数据结构之AVL树

树的平衡,我们已经知道DWL算法,不过DWL算法需要从整体上平衡树,但是树的平衡也可以局部的进行,由Adel'son-Vel'skii-Landis提出了一种经典方法,称为AVL树. 1.概念:AVL树,或者说可适应树,是指树中每个节点的的平衡因子的绝对值不大于1,即只能为-1,0,1 平衡因子:节点的右子树的高度减去左子树的高度 2.AVL树的插入:从新插入节点到根的路径上,修改遇到的节点的平衡因子即可,对其他部分没影响 1)向右子女的右子树插入一个节点,单旋转就可以 2)向右子女的左子树插入

AVL树的实现代码

本文配套源码 /******************************************************************** created: 2007/08/28 filename: avltree.c author: Lichuang purpose: AVL树的实现代码, 参考资料<<数据结构与算法分析-C语言描述>>, 作者Allen Weiss **************************************************

纸上谈兵: AVL树[转]

二叉搜索树的深度与搜索效率 我们在树, 二叉树, 二叉搜索树中提到,一个有n个节点的二叉树,它的最小深度为log(n),最大深度为n.比如下面两个二叉树: 深度为n的二叉树 深度为log(n)的二叉树 这两个二叉树同时也是二叉搜索树(参考树, 二叉树, 二叉搜索树).注意,log以2为基底.log(n)是指深度的量级.根据我们对深度的定义,精确的最小深度为floor(log(n)+1). 我们将处于同一深度的节点归为一层.如果除最后一层外的其他层都被节点填满时,二叉树有最小深度log(n). 二

AVL树双旋转疑问

问题描述 近日在学习AVL树的旋转,尤其是双旋转处有些模糊不清,在MarkAllenWeiss的数据结构与算法分析--C语言描述这本书里面看到,感觉书中的双旋转例程有错误,如下图:这里面的代码显示先右旋,然后左旋,可是注释里面写着是Left-right双旋转,难道不是先左旋,后右旋吗?好像先左旋,后右旋才是正确的做法.请各位指点一下!谢谢.