接文章《平衡二叉树的基本操作之插入》,这里给出删除操作的一种是实现。这里借用文章《平衡二叉树(AVL)的插入和删除详解(上)》中的删除思路:
删除的结点不一定是叶子结点,可能是树中的任何一个结点。在二叉查找树中,我们知道删除的结点可能有三种情况:(1)为叶子结点,(2)左子树或右子树有一个为空,(3)左右子树都不空。对第三种情况的处理有三种处理方式,这里采用删除前驱的方式。注意到我们仍然采用的是递归删除,然后判断删除后树是否“变矮”了,然后进行相应的处理。对(1)(2)中情况,很好处理,树的确是“变矮”了。对于第(3)种情况,我们不能直接找到前驱结点,然后把数据拷贝到原本要删除的根结点,最后直接删除前驱结点。因为这么做,我们无法判断原先根结点子树高度的变化情况。所以我们在找到前驱结点后,不是直接删除,而是采用在根结点左子树中递归删除前驱的方式。同样利用文章《平衡二叉树的基本操作之插入》的左旋和右旋函数实现:
bool AVLDelete(AVLTree *root,int x,bool *unbalanced)
{
if(*root == NULL){
return false;
}
else if (x == (*root)->data) {
if ((*root)->lch

本文介绍了AVL树中删除节点的操作,包括删除节点的三种情况:叶子节点、只有一个子节点或有两个子节点。针对第三种情况,采用了删除前驱节点的方法,并通过递归删除来处理,以保持树的平衡。利用左旋和右旋函数调整树结构,确保树的平衡状态。
最低0.47元/天 解锁文章
2861

被折叠的 条评论
为什么被折叠?



