数据结构——第四讲、树(中)(2)
来源:互联网 发布:淘宝情趣用品类目 编辑:程序博客网 时间:2024/05/16 08:41
4.2 平衡二叉树
二叉搜索树插入节点的顺序不同,得到的二叉树的搜索效率也会发生变化,自然而然的我们就会产生一个疑问,什么样的树比较好?答案就是平衡二叉树,完全二叉树或满二叉树都是平衡二叉树。
平衡二叉树是树上所有的节点的平衡因子都为1,这个平衡因子就是这个节点左右子树的高度差。
平衡二叉树的高度和节点数的关系是 log n 。
一个已经平衡的二叉树,如果插入节点就会使它不平衡,为此需要做一些调整,分为四种不同情况:RR、RL、LL、LR。
RR:插在某节点右儿子的右边;
LL:插在某节点左儿子的左边;
RL:插在某节点右儿子的左边;
LR:插在某节点左儿子的右边;
卧槽,平衡二叉树点击量格外高,本来打算以后再写的,所有的代码在中国大学mooc网浙江大学的数据结构课里面都有,有的在视频里有的在课后的文本里面,有需要的可以直接去看原版。
//先定义AVL树的节点typedef struct AVLNode *AVLTree;struct AVLNode{ ElementType Data; AVLTree Left; AVLTree Right; int Height;}//需要一个返回最大值的函数用来更新树高Max(int a, int b){return a>b?a:b;}//用四个函数做调整,传入一个不平衡的节点,返回一个平衡的节点;/*插在左儿子的左边,就把它的左儿子提上来,把左儿子的右边接到它的左边(因为左儿子的右边比左儿子大比它小)*/AVLTree LLRotation(AVLTree A){ AVLTree B = A->Left; A->Left = B->Right; B->Right = A; /*只有某个节点的左右子树发生变化了,它自己的高度才会发生变化,否则它自己的高度不变,而且这里必须先更新A的高度,因为更新B的高度的时候要用到A的高度。*/ A->Height = Max(A->Left->Height,A->Right->Height)+1; B->Height = Max(B->Left->Height,A->Height)+1; //B的Right就是A; return B;}//插在右儿子的右边,与LL类似,把右儿子提上来,右儿子的左边接在它的右边AVLTree RRRotation(AVLTree A){ AVLTree B = A->Right; A->Right = B->Left; B->Left = A; A->Height = Max(A->Left->Height,A->Right->Height)+1; B->Height = Max(B->Left->Height,A->Height)+1; return B;}/*插在右儿子的左边,需要先将右儿子LL旋,然后再将它自己RR旋转回来,这就一定要符合右儿子左边这种插入情况才能调用此函数,否则会出错。画图可以更清楚的看到实际上做了哪些调整,至于为什么通过左右旋能达到同样的目的不会出错,我也不知道。*/AVLTree RLRotation(AVLTree A){ A->Right = LLRotation(A->Right); return RRRotation(A);}//同理可得LRAVLTree LRRotation(AVLTree A){ A->Left = RRRotation(A->Left); return LLRotation(A);}//插入函数本体,输入要插入的数据和平衡树,返回已经插入好的平衡树。AVLTree Insert(ElementType x, AVLTree T){ if(!T){ T = (AVLTree)malloc(sizeof(struct AVLNode)); T->Data = x; T->Left = T->Right = NULL; T->Height = 0; } else{ if(x > T->Data){ T->Right = Insert(x,T->Right); if(T->Right->Height - T->Left->Height == 2){ if(x > T->Right->Data) T = RRRotation(T); else T = RLRotation(T); } } else if(x < T->Data){ T->Left = Insert(x,T->Left); if(T->Left->Height - T->Right->Height == 2){ if(x < T->Left->Data) T = LLRotation(T); else T = LRRotation(T); } } T->Height = Max(T->Right->Height,T->Left->Height)+1; return T;}
阅读全文
0 0
- 数据结构——第四讲、树(中)(2)
- 数据结构——第四讲、树(中)(1)
- 陈越《数据结构》第四讲 树(中)
- 数据结构——第三讲、树(上)(2)
- 数据结构——第五讲、树(下)(2)
- 数据结构——第七讲、图(中)(1)
- OLE技术专题——第四讲:COM连接点事件(中)
- 数据结构——第三讲、树(上)(1)
- 数据结构——第三讲、树(上)(3)
- 数据结构——第五讲、树(下)(1)
- 数据结构——第五讲、树(下)(3)
- 数据结构——第六讲、图(上)(2)
- 数据结构——第一讲、基本概念(2)
- 数据结构——第二讲、线性结构(2)
- 第四讲项目1—求两数之和(界面友好)
- 第一讲数据结构(2)
- python内置函数第四讲(2)
- 读书笔记(第四讲)operator
- Linux的常用指令(一)
- Oracle PL/SQL小练习
- 树形DP 总结
- 变量、数据与数组操作
- $.Deferred()的promise()方法-学习笔记
- 数据结构——第四讲、树(中)(2)
- Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combined)C
- Android学习 ProgressBar(进度条)
- spring ioc aop 的原理是什么?
- Oracle---数据泵(增强逻辑导入导出)
- MySQl学习笔记
- Qt 学习之路 2(66):访问网络(2)
- 程序员面试技巧
- [JAVA]浅谈String, StringBuilder字符串拼接速度