关于AVL树的思考

  AVL树即平衡二叉树,每个结点有一个平衡因子,即左子树高度减去右子树高。每插入一个结点时,从根部开始按二叉排序树的方法,与节点不断比较,按大小向左右子树插入。在与最后的节点比较后插入时,若有兄弟节点,说明树的高度没有变,此时依然平衡;若没有,则小范围内树高改变了,需回溯,依次更改祖先的平衡因子,若遇到有平衡因子失衡,则,调整,使其与插入之前高度一致,以保证平衡,若未失衡,且平衡因子不变,说明该子树高度未变,停止回溯。

  简而言之就是插入后从底开始看有没有影响树高,小树高可能影响大树高,若无波澜则不变,若有波澜则看是否失衡,失衡调整结束,仅仅只是波澜则继续向上看波澜,平衡因子的值发生变化说明有波澜。

  对于删除,按照二叉排序树的删除方式调整,分为两种三种情况,没有子树和只有一个子树,有两个子树。由平衡二叉树的性质容易知道:没有子树即叶子节点,只有一个子树即叶子节点的父节点,两个子树即其它祖先节点。只有一个子树的情况用子节点替代后删除子节点,两个子树用右子树的最左端的节点替代后删除(即中序遍历的首值、最大值),之后该值用右子树替代,等于两个晋升替代,由于最大值只有右子树,所以其右子树只能为叶子或为空,为空时最大值即为叶子,不为空则为叶子的父节点。三种方法都可以将删除的节点替代为叶子节点。所以与插入相似,归纳为从被删除的该结点开始调整祖先平衡因子,遇到波澜向上看波澜,判断是否要调整,若无波澜结束。

  调整就是两种(四种)情况,相关解释很多。插入时有LL(RR),LR(RL);删除时也可归纳为LL与LR,L代表左高,删除时的两种情况是LL的左边被删,树高减一,该结节因子为0;LR右边被删,树高不变,因子变为2;LR好办,只需调整该结节即可,调整完因子不变,可停止。而LL则需不断回溯,看波澜,最后也可视为一个LL。

  更新:删除节点时可以直接用子树节点替代,若有两个子节点高度相等,则随便选一个节点替代,树高度不变。若有一个高一个低,则拿高的替代,树高减一,回溯。回溯需要保存三个节点指针,以判断是LL还是LR。

转载于:https://www.cnblogs.com/lector/p/10198916.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值