2024年Go最全【数据结构】平衡二叉树的插入、删除_平衡二叉树插入怎么插,Golang内存优化面试题

img
img
img

既有适合小白学习的零基础资料,也有适合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进行右旋,完成平衡操作。



> 
> #### 插入节点
> 
> 
> 


插入过程也是一个二叉树查找的过程,先看图


![](https://img-blog.csdn.net/20180815110101337?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z4a2NzZG4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)


在插入节点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(T
null)
{
/* 插入新结点,树“长高”,置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: /
原本左、右子树等高,现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值