平衡二叉树(AVL树)
来源:互联网 发布:淘宝哪些店铺衣服好看 编辑:程序博客网 时间:2024/06/06 19:33
平衡二叉树的相关概念概念:
平衡二叉树是一种二叉排序树,它具有如下性质:
1、每一个结点的左子树和右子树的深度最多相差1;
2、每一个结点的左子树和右子树也都是平衡二叉树
平衡因子(BF,balance factor):
结点的平衡因子是该结点的左子树的深度与右子树的深度之差,有-1,0,1三种值。
最小不平衡子树
距离插入结点最近,且平衡因子的绝对值大于1的结点为根的子树,我们称为最小不平衡子树。
平衡二叉树构建的基本思想:
在构建二叉排序树的过程中,每当插入一个结点时,首先检查是否因插入而破坏了树的平衡性。若是,则找出最小不平衡子树。在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。
对平衡树进行调整归纳的4种情况:
(1)LL型
在A的左孩子的左子树上插入结点F,使A的平衡因子由1变为2,则进行一次顺时针旋转调整。由于结点A和D发生冲突,将D变为A的左子树,如图:
(2)RR型
和LL型刚刚相反,如图:
(3)LR型
在A的左孩子的右子树上插入结点F,使A的平衡因子由1变为2,则先进行一次逆时针旋转,再进行一次顺时针旋转。即先使之成为LL型,再按照LL型处理。如图:
(4)RL型
和LR型刚刚相反,如图:
算法代码:
处理左平衡代码
#define LH 1#define EH 0#define RH -1typedef struct BiNode {int data;int bf;struct BiNode *lchild,*rchild;}BiNode;void LL(BiNode * p){BiNode * L;L = p->lchild;p->lchild = L->rchild;L->rchild = p;p = L;}void RR(BiNode * p){BiNode * R;R = p->rchild;p->rchild = R->lchild;R->lchild = p;p = R;}void LeftBalance(BiNode * p)//处理左边平衡情况{BiNode * L,* Lr;L = p->lchild;switch(L->bf){case LH://新结点插入在p的左孩子的左子树上,要作顺时针旋转,即LL处理p->bf = L->bf = EH;LL(p);break;case RH://新结点插入在p的左孩子的右子树上,作LR处理Lr = L->rchild;switch(Lr->bf)//修改p及其左孩子的bf{case LH:p->bf = RH;L->bf = EH;break;case EH:p->bf = L->bf = EH;break;case RH:p->bf = EH;L->bf = LH;break;}Lr->bf = EH;RR(p->lchild);//逆时针处理LL(p);//顺时针处理}}右平衡与左平衡处理情况相反,代码稍加修改就OK了,这里就不给出了,可以参考以上代码。
再看看平衡二叉树整个处理过程(代码):
//在平衡二叉树T中若不存在和e相同的结点,则插入一个数据元素为e的新结点并返回1,否则返回0。若//因二叉排序树失去平衡,则作旋转处理,taller反映T长高与否int InsertAVL(BiNode * T,int e,bool * taller){if (!T){T = (BiNode *)malloc(sizeof(BiNode));T->data = e;T->lchild = T->rchild = NULL;T->bf = EH;* taller = TRUE;}else{if (e == T->data)//若存在相同元素{*taller = FALSE;return FALSE;}if (e < T->data)//在T的左子树搜索{if (!InsertAVL(T->lchild,e,taller))//递归处理return FALSE;if (*taller)//已插入到T的左子树中且左子树“长高”{switch(T->bf)//检查T的平衡度{case LH://原本左子树比右子树高,需作左平衡处理LeftBalance(T);*taller = FALSE;break;case EH://原本左右子树等高,现因左子树增高而树增高T->bf = LH;*taller = TRUE;break;case RH://原本右子树比左子树高,现左右子树等高T->bf = EH;*taller = FALSE;break;}}}else//在T的右子树搜索{if (!InsertAVL(T->rchild,e,taller))return FALSE;if (*taller){switch(T->bf){case LH:T->bf = EH;*taller = FALSE;break;case EH:T->bf = RH;*taller = TRUE;break;case RH:RightBalance(T);*taller = FALSE;break;}}}}return TRUE;}
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- AVL 平衡二叉树
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- AVL 平衡二叉树
- avl平衡二叉树
- 二叉平衡树AVL
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 平衡二叉树 AVL
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 二叉平衡树AVL
- 设置口令和标语的ios命令
- InnoDB和MyISAM区别总结
- 使用面向对象技术创建高级 Web 应用程序
- Tegra平台back camera 驱动实现二
- JSP在线聊天室——实验二之用例建模
- 平衡二叉树(AVL树)
- TCP/IP 学习
- 从(0,1)中平均随机出几次才能使得和超过1?(e)
- Linux中的shell编程
- 【第五章】Spring表达式语言 之 5.4在Bean定义中使用EL—跟我学spring3
- 用gdb调试程序笔记: 以段错误(Segmental fault)为例
- iphone开发-在页面中记住登录名和密码的方法
- 【第六章】 AOP 之 6.1 AOP基础 ——跟我学spring3
- 【第六章】 AOP 之 6.2 AOP的HelloWorld ——跟我学spring3