平衡二叉树的实现原理

1.概念

平衡二叉树建立在二叉排序树的基础上,目的是使二叉排序树的平均查找长度更小,即让各结点的深度尽可能小,因此,树中每个结点的两棵子树的深度不要偏差太大。

平衡二叉树的递归定义:平衡二叉树是一棵二叉树,其可以为空,或满足如下2个性质:①左右子树深度之差的绝对值不大于1。②左右子树都是平衡二叉树。

平衡因子的概念:结点的平衡因子 = 结点的左子树深度 — 结点的右子树深度。

最低不平衡结点的概念:用A表示最低不平衡结点,则A的祖先结点可能有不平衡的,但其所有后代结点都是平衡的。


2.平衡化的实现

整个实现过程是通过在一棵平衡二叉树中依次插入元素(按照二叉排序树的方式),若出现不平衡,则要根据新插入的结点与最低不平衡结点的位置关系进行相应的调整。分为LL型、RR型、LR型和RL型4种类型,各调整方法如下(下面用A表示最低不平衡结点):

(1)LL型调整:

由于在A的左孩子(L)的左子树(L)上插入新结点,使原来平衡二叉树变得不平衡,此时A的平衡因子由1增至2。下面图1是LL型的最简单形式。显然,按照大小关系,结点B应作为新的根结点,其余两个节点分别作为左右孩子节点才能平衡,A结点就好像是绕结点B顺时针旋转一样。


图1  最简单的LL型调整

LL型调整的一般形式如下图2所示,表示在A的左孩子B的左子树BL(不一定为空)中插入结点(图中阴影部分所示)而导致不平衡( h 表示子树的深度)。这种情况调整如下:①将A的左孩子B提升为新的根结点;②将原来的根结点A降为B的右孩子;③各子树按大小关系连接(BL和AR不变,BR调整为A的左子树)。


图2  一般形式的LL型调整

(2)RR型调整:

由于在A的右孩子(R)的右子树(R)上插入新结点,使原来平衡二叉树变得不平衡,此时A的平衡因子由-1变为-2。图3是RR型的最简单形式。显然,按照大小关系,结点B应作为新的根结点,其余两个节点分别作为左右孩子节点才能平衡,A结点就好像是绕结点B逆时针旋转一样。


图3  最简单的RR型调整

RR型调整的一般形式如下图4所示,表示在A的右孩子B的右子树BR(不一定为空)中插入结点(图中阴影部分所示)而导致不平衡( h 表示子树的深度)。这种情况调整如下:①将A的右孩子B提升为新的根结点;②将原来的根结点A降为B的左孩子;③各子树按大小关系连接(AL和BR不变,BL调整为A的右子树)。


图4  一般形式的RR型调整

(3)LR型调整:

由于在A的左孩子(L)的右子树(R)上插入新结点,使原来平衡二叉树变得不平衡,此时A的平衡因子由1变为2。图5是LR型的最简单形式。显然,按照大小关系,结点C应作为新的根结点,其余两个节点分别作为左右孩子节点才能平衡。


图5  最简单的LR型调整

LR型调整的一般形式如下图6所示,表示在A的左孩子B的右子树(根结点为C,不一定为空)中插入结点(图中两个阴影部分之一)而导致不平衡( h 表示子树的深度)。这种情况调整如下:①将C的右孩子B提升为新的根结点;②将原来的根结点A降为C的右孩子;③各子树按大小关系连接(BL和AR不变,CL和CR分别调整为B的右子树和A的左子树)。


图6  一般形式的LR型调整

(4)RL型调整:

由于在A的右孩子(R)的左子树(L)上插入新结点,使原来平衡二叉树变得不平衡,此时A的平衡因子由-1变为-2。图7是RL型的最简单形式。显然,按照大小关系,结点C应作为新的根结点,其余两个节点分别作为左右孩子节点才能平衡。


图7  最简单的RL型调整

RL型调整的一般形式如下图8所示,表示在A的右孩子B的左子树(根结点为C,不一定为空)中插入结点(图中两个阴影部分之一)而导致不平衡( h 表示子树的深度)。这种情况调整如下:①将C的右孩子B提升为新的根结点;②将原来的根结点A降为C的左孩子;③各子树按大小关系连接(AL和BR不变,CL和CR分别调整为A的右子树和B的左子树)。


图8  一般形式的RL型调整


平衡二叉树的深度接近log2n的数量级,从而保证在二叉排序树上插入、删除和查找等操作的平均时间复杂度为O(log2n)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
平衡二叉树是一种特殊的二叉搜索树,它的左右子树的高度差不超过1,以此来保证树的高度不会太高,从而保证树的查询、插入、删除等操作的时间复杂度都能在O(logn)的范围内。底层实现主要有以下几点: 1. 节点结构体:平衡二叉树的节点结构体通常包括关键字key、左右子树的指针、平衡因子等成员变量。平衡因子是左右子树高度差的绝对值,是用来判断是否需要进行旋转操作的。 2. 插入操作:插入节点时,首先按照二叉搜索树的规则找到合适的位置,插入新节点。然后从新节点到根节点依次更新每个节点的平衡因子,判断是否需要进行旋转操作。如果某个节点的平衡因子超过1,则需要进行旋转操作来保证树的平衡性。 3. 旋转操作:旋转操作是平衡二叉树的核心操作,包括左旋、右旋、左右旋、右左旋等四种。左旋和右旋是最基本的旋转操作,左右旋和右左旋是由左旋和右旋组合而成的复合操作。旋转操作可以通过改变节点和子树的指针来实现,具体操作可以参考相关算法书籍和资料。 4. 删除操作:删除节点时,需要先按照二叉搜索树的规则找到待删除节点,然后考虑三种情况:如果待删除节点是叶子节点,则直接删除;如果待删除节点只有一棵子树,则将该子树的根节点替换待删除节点;如果待删除节点有两棵子树,则找到其前驱或后继节点替换待删除节点,并将其前驱或后继节点删除。删除节点后,需要从其父节点到根节点依次更新每个节点的平衡因子,判断是否需要进行旋转操作。 总之,平衡二叉树的底层实现需要掌握节点结构体、插入操作、旋转操作和删除操作等关键要点,只有深入理解这些要点,才能真正理解平衡二叉树的本质和优点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值