请教一个AVL树的删除问题?
这几天没事复习了一下数据结构,把以前没有实现的代码又从头自己实现了一遍,但是搞到AVL树那边遇到了各种困难,一开始是插入操作,各种旋转,最后好不容易解决了。。但是到了删除又遇到困难了。
首先我先说下我得删除思路吧:
先根据关键字找到待删除的节点,记为current。
然后判断current是否有左子树,有就找到左子树最大值节点max(注意max既然是最大值节点,那么它的右子树一定为空,左子树有可能为空),然后将current的数据和max的数据做交换,再将current指向max节点,
否则判断current是否有右子树,有就找到右子树的最小值节点min(同理最小值节点min的左子树一定为空,右子树可能为空),然后将current的数据和min的数据做交换,再将current指向min节点。
现在问题归结于删除current节点即可,current为叶节点或者只有一个子树的节点,下面的删除操作遇到了困难,如何在删除后回朔判断删除路径上的所有节点的平衡因子?
[解决办法]
>current为叶节点
那就直接删
>只有一个子树的节点
上面两个只要做一个就可以了。所以只有一个子树,上面那个逻辑依然能做。
别忘了最后还要重新平衡。