平衡二叉树插入,比较简单,主要工作在插入结点后的调平,通过递归调用InsertAVL,插入结点调整返回调整后的数高度是否变化,依次调整返回,平衡二叉树插入结点的调整有四种情况,实现主要是在R_Balance和L_Balance里。
删除结点要复杂一点,递归查找删除结点,找到后判断:
外界链表是否为空,如果不空取下一个,树不变
否则:
1)如果为叶子结点,直接删掉,调整返回
2)如果只有一个子树,删除该节点,子树补位,调整返回
3)如果有两个子树,在左子树上向右递归查找删除最右边右孩子为空的结点,替换待删除结点,调整返回
一直在递归 +_+
AVLNode.h
struct AVLNode
{
int key;
int bf;//平衡因子
AVLNode *lchild, *rchild;
AVLNode *next; //外界链表,存放相同key值的结点
AVLNode(int k):key(k), bf(0), lchild(nullptr), rchild(nullptr), next(nullptr){}
};
extern const int LH, RH, EH;
void L_Rotate(AVLNode **p);
void R_Rotate(AVLNode **p);
void L_Balance(AVLNode **p);
void R_Balance(AVLNode **p);
bool InsertAVL(AVLNode **t, AVLNode *p);
bool DeleteAVL(AVLNode **t, int key, AVLNode