AVL(自平衡二叉树)树的实现(C语言)

AVL树是可以在插入、删除节点之后进行自平衡的树,平衡的定义是结点的左子树和右子树的深度差不超过1,也就:

| Deep(LeftChild) - Deep(RightChild)| <= 1,整棵树的平衡也就是树的每个结点都是满足上述情况。那么下面我们要解决问题就是当树在插入数据和删除数据的时候,如果树不平衡了我们该怎么办。

上面就是我们在插入或者删除的时候可能导致的树的不平衡的所有情况,不信可以自己去尝试。下面我们进行分类讨论:

情况1和4是最简单的,我们只需要对结点Z进行一个左右的旋转即可,旋转和红黑树的旋转一样。目的是降低子树的高度差。

情况2和情况3需要先对y进行左或者右旋转,变成情况1和4,然后再照着情况1,和4处理。

        虽然情况我们说明白了,但是我们应该要注意到这么一个问题,当我们插入或者删除数据的时候,可能并不是引起附近的结点不平衡,有可能是引起的很远的结点的不平衡,例如:

当我们插入L的时候,结果引起的是根节点E的不平衡,所以现在我们要面临的一个问题就是如何判断当前是出于什么情况。下面我提供一种思路:

我们可以这样看,其实每次插入删除的时候引起的不平衡的结点都是插入、删除的结点的父节点,不肯是其父节点的兄弟结点之类,而且我们总是通过不平衡结点加上往下的两个结点,来判断出事情况几。往下的结点怎么选取呢?

选取的规定就是,看刚插入或者删除的结点是在不平衡结点的左子树还是右子树,加入在左

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值