数据结构之二叉平衡树

本文探讨了AVL树,一种特殊的二叉查找树,其左右子树高度差不超过1,确保搜索效率为O(logN)。当插入节点导致不平衡时,通过单旋转和双旋转操作来恢复平衡。提供了头文件avl.h和具体实现avl.cpp的介绍。

二叉平衡树(AVL树),是带有平衡条件的二叉树查找树,这个平衡条件必须要容易保持,且必须保证树的深度是O(logN).。这里的平衡条件是左右子树高度差最多差1的二叉查找树。如果插入一个节点后破坏了平衡条件,那么就要做一些操作去恢复AVL树, 这里的操作一般称为旋转。

第一种情况是插入的节点在外面,即(左-左或右-右)、另一种是节点插在里面,即(左-右或右-左), 对于第一种情况我们采用单旋转,第二种采用双旋转,如下图:



代码实现

头文件 avl.h

#ifndef AVL_H_
#define AVL_H_

struct Node;
typedef int ElementType;
typedef struct Node *ptrToNode;
typedef struct Node *AVLTree;

// 插入节点
ptrToNode insert(AVLTree T,ElementType e);
// 左单旋转
ptrToNode singleRoateWithLeft(ptrToNode ptr);
// 左右双旋转
ptrToNode doubleRoateWithLeftRight(ptrToNode ptr);
// 右单旋转
ptrToNode singleRoateWithRight(ptrToNode ptr);
// 右左双旋转
ptrToNode doubleRoateWithRightLeft(ptrToNode ptr);
// 中序遍历
void midPrint(AVLTree T);
// 返回节点的高度
int height(AVLTree T);
// 返回最大值
int max(int a, int b);
// 销毁树
void destory(AVLTree &T);

#endif /* AVL_H_ */

具体实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值