实现Avl平衡树】的更多相关文章

实现Avl平衡树   一.介绍 AVL树是一种自平衡的二叉搜索树,它由Adelson-Velskii和 Landis于1962年发表在论文<An algorithm for the organization of information>中.AVL树的特点是,其左右子树的高度差的绝对值小于2(空树的高度定义为 -1,无子树的树高度为0).如下图所示,左边的二叉树为AVL树,而右边的二叉树root节点的左子树高度为2,右子树高度为0,高度差为2,不是AVL树.与普通二叉树相同的是查找和遍历:但是…
AVL 平衡树和树旋转 目录 AVL平衡二叉树 树旋转 代码实现 1 AVL平衡二叉树 AVL(Adelson-Velskii & Landis)树是一种带有平衡条件的二叉树,一棵AVL树其实是一棵左子树和右子树高度最多差1的二叉查找树.一棵树的不平衡主要是由于插入和删除的过程中产生的,此时则需要使用旋转来对AVL树进行平衡. AVL Tree: 0 _____|_____ | | 0 0 |___ ___|___ | | | 0 0 0 |__ | 0 插入引起不平衡主要有以下四种情况: In…
环境:C++ 11 + win10 IDE:Clion 2018.3 AVL平衡树是在BST二叉查找树的基础上添加了平衡机制. 我们把平衡的BST认为是任一节点的左子树和右子树的高度差为-1,0,1中的一种情况,即不存在相差两层及以上. 所谓平衡机制就是BST在理想情况下搜索复杂度是o(logn) 但是如果在(存在某一节点,该节点的左子树的高度与右子树的高度差>1)这种状况下,复杂度会超过o(logn) 举个极端的例子如加入1,2,3,4,BST就退化为一个线性的链表,复杂度变成了o(n) 为了…
/* **AVL平衡树插入例程 **2014-5-30 11:44:50 */ avlTree insert(elementType X, avlTree T){ if(T == NULL){ T = malloc(sizeof(struct avlTree)); if(T == NULL) fatalError("Out of space!!!"); T->element = X; T->height = 0; T->left = T->right = NUL…
AVL是一种平衡二叉树,它通过对二叉搜索树中的节点进行旋转使得二叉搜索树达到平衡.AVL在所有的平衡二叉搜索树中具有最高的平衡性. 定义 平衡二叉树或者为空树或者为满足如下性质的二叉搜索树: 左右子树的高度之差绝对值不超过1 左右子树仍然为平衡二叉树 定义平衡因子 BF(x) = x的左子树高度 - x的右子树的高度.平衡二叉树的每个节点的平衡因子只能为-1, 0, 1. 维持平衡思想 若二叉树当前为平衡状态,此时插入/删除一个新的节点,此时有可能造成二叉树不满足平衡条件,此时需要通过对节点进行…
看了网上三四篇博客,学习了AVL树维护平衡的方式.但感觉他们给出的代码都有一点瑕疵或者遗漏,懂得了思想之后,花了一些时间把他们几篇的长处结合起来,没有使用指针,实现了一下.每个小逻辑功能都抽象成了函数,应该比较好理解,代码逻辑看起来也比较清晰.下面给出主要的功能插入和删除.至于其他一些没有动到树结构的操作,如查询,求前驱后继等,同其他BST,没有什么特别.这里顺带一提,下面的代码中,没有维护子树size,如果要求第K小或者名次,可以在upd函数等处添加有关size的维护,之后便可以支持相关查询了…
1.是二叉搜索树(Binary Search Tree) 2.树和所有左右子树高度之差为-1,0,1 平衡因子(balance factor) =右子树高度-左子树高度 平衡化旋转: 1.从插入位置向根节点计算节点的平衡因子: 2.若发现不平衡点(即平衡因子绝对值大于1),从此节点向下取两层: 3.若三节点在同一直线上,则左单旋或右单旋,中间为旋转中心: 4.否则左右双旋或右左双旋,最下为旋转中心.…
C++实现的avl平衡树 #include <stdlib.h> #include <time.h> #include <string.h> #include <vector> #include <stdio.h> using namespace std; class AvlNode { public : int data; AvlNode *parent; AvlNode *left; AvlNode *right; int height; i…
[SinGuLaRiTy-1009] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 二叉查找树 二叉查找树是指具有下列性质的非空二叉树: ⑴若根结点的左子树不空,则左子树的所有结点值均小于根结点值: ⑵若根结点的右子树不空,则右子树的所有结点值均不小于根结点值: ⑶根结的左右树也分别为二叉排序树: 显然,对二叉排序树进行中序遍历,可得出结点值递增的排序序列. eg. 下图即是一棵二叉查找树: 其中序遍历为8,11,23,39,46,68…
AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树.   2.带有平衡条件:每个结点的左右子树的高度之差的绝对值最多为1(空树的高度为-1).   也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树).       对Avl树进行相关的操作最重要的是要保持Avl树的平衡条件.即对Avl树进行相关的操作后,要进行相应的旋转操作来恢复Avl树的平衡条件.       对Avl树的插入和删除都可以用递归实现,文中也给出了插入的非递归版本,关键在于要用…