平衡二叉树(可重复key)插入删除(c/c++实现)

本文介绍了如何使用C/C++实现平衡二叉树(允许重复key)的插入和删除操作。插入操作主要涉及插入节点后的平衡调整,包括四种情况的处理。删除操作则更为复杂,需要考虑删除节点的不同情况,如叶子节点、单子树节点和双子树节点的处理,并进行相应的平衡调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平衡二叉树插入,比较简单,主要工作在插入结点后的调平,通过递归调用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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值