入门二叉平衡树的世界
入门二叉平衡树的世界
1. 二叉平衡树的概念
#include <iostream.h>
#include <string.h>
#define NUM 10
typedef int KeyType;
class AVLTree;
class AVLNode
{
public:KeyType key;//任意一结点的左子树深度减去右子树的//深度称为该节点的平衡因子.int bf; //记录平衡因子AVLNode *lchild;AVLNode *rchild;AVLNode(){lchild = NULL;rchild = NULL;bf = 0;}
};//平衡二叉排序树
class AVLTree
{
public:AVLNode *root;AVLTree(){root = NULL;}AVLNode* LL_Rotate( AVLNode *a ); //LL(顺时针)型调整AVLNode* RR_Rotate( AVLNode *a ); //RR(逆时针)型调整AVLNode* LR_Rotate( AVLNode *a ); //LR(先逆后顺)型调整AVLNode* RL_Rotate( AVLNode *a ); //RL(先顺后逆)型调整void AVLInsert( AVLNode *&pavlt, AVLNode *s ); //插入一个新结点
}; /*** LL(顺时针)型调整* */
AVLNode* AVLTree::LL_Rotate( AVLNode *a )
{ if( a == NULL ){cout << "the pointer is null!" << endl;return NULL;}AVLNode *b;b = a->lchild; //b指向a的左子树根结点a->lchild = b->rchild; //b的右子树挂在a的左子树上b->rchild = a;a->bf = b->bf = 0;return b;
}/*** RR(逆时针)型调整* */
AVLNode* AVLTree::RR_Rotate( AVLNode *a )
{ if( a == NULL ){cout << "the pointer is null!" << endl;return NULL;}AVLNode *b;b = a->rchild;a->rchild = b->lchild;b->lchild = a;a->bf = b->bf = 0;return b;
}/*** LR(先逆后顺)型调整* */
AVLNode* AVLTree::LR_Rotate( AVLNode *a )
{ if( a == NULL ){cout << "the pointer is null!" << endl;return NULL;}AVLNode *b, *c;b = a->lchild;c = b->rchild;a->lchild = c->rchild;b->rchild = c->lchild;c->lchild = b;c->rchild = a;//调整平衡因子if( c->bf == 1 ){a->bf = -1;b->bf = 0;}else if( c->bf == -1 ){a->bf = 0;b->bf = 1;}else{b->bf = a->bf = 0;}c->bf = 0;return c;
}/*** RL(先顺后逆)型调整* */
AVLNode* AVLTree::RL_Rotate( AVLNode *a )
{ if( a == NULL ){cout << "the pointer is null!" << endl;return NULL;}AVLNode *b, *c;b = a->rchild;c = b->lchild;a->rchild = c->lchild;b->lchild = c->rchild;c->lchild = a;c->rchild = b;//调整平衡因子if( c->bf == 1 ){a->bf = 0;b->bf = -1;}else if( c->bf == -1 ){a->bf = 1;b->bf = 0;}else{a->bf = b->bf = 0;}c->bf = 0;return c;
}/*** 将结点s插入pavlt为根结点的平衡二叉排序树中* */
void AVLTree::AVLInsert( AVLNode *&pavlt, AVLNode *s )
{AVLNode *f, *a, *b, *p, *q;if( pavlt == NULL ){pavlt = s;return;}a = pavlt;f = NULL;p = pavlt;q = NULL;//寻找插入点位置及最小不平衡树的子树while( p != NULL ){if( p->key == s->key ) //AVL中已经存在关键字return;if( p->bf != 0 ) //寻找最小不平衡子树{a = p;f = q;}q = p;if( s->key < p->key ) p = p->lchild;elsep = p->rchild;}if( s->key < q->key ) //将结点*s插入到合适的位置上去q->lchild = s;elseq->rchild = s;p = a;while( p != s ) //插入结点后修改相应的平衡因子{if( s->key < p->key ){p->bf++;p = p->lchild;}else{p->bf--;p = p->rchild;}}if( a->bf > -2 && a->bf < 2 ) //插入结点后没有破坏平衡树return;if( a->bf == 2 ){b = a->lchild;if( b->bf == 1 ) //结点插在*a的左孩子的左子树中p = LL_Rotate( a ); //LL型调整else //结点插在*a的左孩子的右子树中p = LR_Rotate( a ); //LR型调整}else{b = a->rchild;if( b->bf == 1 ) //结点插在*a的右孩子的左子树中p = RL_Rotate( a ); //RL型调整else //结点插在*a的右孩子的右子树中p = RR_Rotate( a ); //RR型调整}if( f == NULL ) //原*a是AVL树的根pavlt = p;else if( f->lchild == a ) //将新子树链到原结点*a的双亲结点上f->lchild = p;else f->rchild = p;
}/*** 在VC6.0下测试成功* cheneagle:2009.8.6 */
int main( void )
{int a[NUM] = { 34, 18, 13, 73, 16, 52, 58, 67, 82, 76 };int i = 0;AVLTree tree;AVLNode pNode[NUM], *p = NULL;for( i = 0; i < NUM; i++ ){pNode[i].key = a[i];tree.AVLInsert( p, &pNode[i] );}return 0;
}
关于二叉平衡树的删除,我们也是先用二叉搜索树的删除节点方法(较插入复杂),然后再调整。
入门二叉平衡树的世界相关推荐
- 入门二叉搜索树的世界
入门二叉搜索树的世界 1. 二叉搜索树的概念 二叉搜索树,二叉查找树,二叉排序树说的都是一个概念.这篇博文中我们称其为二叉搜索树.二叉搜索树指的是一棵空树,或者具有下列性质的二叉树: 1)弱左 ...
- 数据结构源码笔记(C语言):二叉平衡树的相关操作算法
//二叉平衡树的相关运算 #include<stdio.h> #include<malloc.h> #include<string.h>typedef char I ...
- 数据结构与算法——二叉平衡树(AVL树)详解
文章目录 AVL树概念 不平衡概况 四种平衡旋转方式 RR平衡旋转(左单旋转) LL平衡旋转(右单旋转) RL平衡旋转(先右后左双旋转) LR平衡旋转(先左后右单旋转) java代码实现 总结 AVL ...
- AVL树(二叉平衡树)详解与实现
公众号文章链接 AVL树概念 前面学习二叉查找树和二叉树的各种遍历,但是其查找效率不稳定(斜树),而二叉平衡树的用途更多.查找相比稳定很多.(欢迎关注数据结构专栏) AVL树是带有平衡条件的二叉查找树 ...
- 【Python数据结构】——二叉平衡树AVL(查找、构建、删除、插入、打印、遍历)
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/7/28 20:57 # @Author : @linlianqin # @S ...
- 二叉平衡树平衡方法(RR、LL、RL、LR)
二叉平衡树的平衡方法 (RR.LL.RL.LR) 1.RR型 右单旋 右右型:插入节点在不平衡因子节点右子树的右边 右单旋:向左旋转 2.LL型 左单旋 左左型:插入节点在不平衡因子节点的左子树的左边 ...
- 【数据结构进阶】二叉平衡树
一. 二叉平衡树 概念 二叉搜索树有称 二叉排序树,它也可以是一个空树. 如果它的左子树不为空,则左子树上所有结点的值都小于根结点的值 如果他的右子树不为空,则右子树上所有结点的值都大于根结点的值 它 ...
- C语言实现二叉平衡树
[前置知识]二叉树和二叉排序树 目录 1.什么是AVL树 2.怎么平衡 前言 对于大量的数据而言,链表的线性访问时间太慢,不宜使用.本章节将会介绍一种简单的数据结构:树(tree),其大部分操作的运行 ...
- 二叉平衡树(C++)
背景: 二叉平衡树,就是根据二叉搜索树进行优化,让其速度更加的快,如果读者没有学过二叉搜索树,可以前往以下链接查看资料: http://t.csdn.cn/Sjjjshttp://t.csdn.cn/ ...
最新文章
- eSpeak: Linux 文本转语音工具
- python手机版打了代码运行不了-android手机安装python并写代码运行
- 一、MySQL数据库基础
- CodeForces - 858D Polycarp's phone book(字典树/map)
- Windows 2008之Hyper-V安装攻略
- Spring Data MongoDB教程
- latex 调整表格的行高_latex 表格如何控制行高,行距,行与行之间的距离
- IR2104电机驱动
- PS更换证件照背景色,并去除人物像边线
- F28335课后习题记录
- 世界各地 史上最全最详细无线通信频率分配表(内容含概wifi、2.4G、5G,绝对值得收藏)
- 如何输出一个国际象棋棋盘
- 取消研究生论文发表需求,985大学官宣!
- 关于mysql答辩的问题_答辩常见问题总结.doc
- phpStrom连接MySQL数据库
- 点云ply格式文件详解
- 亚马逊测评提升销量有什么好办法,分享6点技巧
- busblaster-v3c调试hg255d的脚本代码
- UDP与IP的不可靠程度是否相同
- 师夷之技以制夷 吾尝终日而思矣,不如须臾之所学也