既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
R_Rotate(T);
break;
}
}
首先,定义三个常数变量,分别代码1、0、-1。
(1)函数被调用,传入一个需调整平衡型的子树T,根节点为k3,由于LeftBalance函数被调用时,其实是已经确认当前子树是不平衡的状态,且左子树的高度大于右子树的高度。换句话说,此时T的根结点应该是平衡因子BF的值大于1的数。k3的BF为2
(2)将T的左孩子赋值给L。L指向K1.
(3)然后是分支判断。
(4)当L(k1)的平衡因子为LH,即为1时,表明它与根结点的BF值符号相同,因此,将它们的BF值都改为0,并进行右旋(顺时针)操作,是左左情况
(5)当L的平衡因子为RH时,即为-1时,表明它与根结点的BF值符号相反,此时需要做双旋操作。针对L的右孩子k2的BF作判断,修改结点T(k3)和L(k1)的BF值。将当前的Lr的BF改为0。从图中看到K2的左结点是连接到K1的右子树上,右结点连接到K3的左子树,其中当k2结点为RH,说明K2有右结点有,左结点无,k3为0((\*T)->bf=EH; ),k1就没有右结点为LH。当为Lh看程序。
(6)对根结点的左子树进行左旋,以K1为根节点进行左旋转,形成左左情况。
(7)对根结点K3进行右旋,完成平衡操作。
>
> #### 插入节点
>
>
>
插入过程也是一个二叉树查找的过程,先看图

在插入节点2之前,该树还是一颗平衡树,当插入节点2之后,节点3就成为了不平衡点,需要对节点3进行左平衡处理。
在详细的分析一下:
首先从根节点4开始搜索,发现2<4,于是搜索4的左节点3,发现2<3,就搜索1,2>1,搜索1的右节点,此时发现1的右节点为空,就执行插入操作,将2插入到1的右节点,那么怎么发现此时这棵树不平衡的呢?因为我们是通过递归寻找插入点,当找到插入点在1的右节点之后,开始往父节点回溯,回溯过程中告诉父节点,孩儿有没有长高,如果长高了,父节点就要判断左右子树高度差是否大于1,也就是处于不平衡状态,每个节点都有个平衡因子,EH=0(等高),LH=1(左边高1),RH=-1(右边高1)例如,插入2之前,节点1的BF=0,节点3BF=1,节点4BF=1,插入节点2之后,往父节点1回溯,说我长高了,1节点BF=0,现在右节点长高了,所以此时节点1BF=-1,在往父节点3回溯,告诉父节点3,我长高了,而父节点3BF=1,而现在左孩子长高了,那BF=2,此时节点3称为不平衡点,需要对节点3做左平衡处理。处理完成后,2节点变成了1,3的父节点,此时2节点的高度和没插入节点2之前3节点高度一样,于是告诉父节点4,我没有长高,此时递归结束。
代码如下:
public void insertAVL(int e){
if(rootnull){
root=new Node(e,EH,null,null,null);
return;
}
TS t=new TS();
InsertAVL(root,e,t,null);
}
/* 若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个 /
/ 数据元素为e的新结点,并返回1,否则返回0。若因插入而使二叉排序树 /
/ 失去平衡,则作平衡旋转处理,布尔变量taller反映T长高与否。 */
private boolean InsertAVL(Node T,int e,TS tl,Node parent)
{
if(Tnull)
{
/* 插入新结点,树“长高”,置taller为TRUE /
Node nNode=new Node(e,EH,null,null,parent);
if(e<parent.value)
parent.lchild=nNode;
else
parent.rchild=nNode;
tl.taller=TRUE;
}
else
{
if (e==T.value)
{
/ 树中已存在和e有相同关键字的结点则不再插入 /
tl.taller=FALSE;
return false;
}
else if (e<T.value)
{
/ 应继续在T的左子树中进行搜索 /
if(!InsertAVL(T.lchild,e,tl,T))
return false;
if(tl.taller) / 已插入到T的左子树中且左子树“长高” /
switch(T.bf) / 检查T的平衡度 /
{
case LH: / 原本左子树比右子树高,需要作左平衡处理 /
LeftBalance(T);
tl.taller=FALSE;
break;
case EH: / 原本左、右子树等高,现