一、概念
① AVL tree ∈ BST;
②任意一个节点 需满足abs(childL.heiht - childR.height) <= 1;
二、实现
①avl.h
#include<stack>
using namespace std;
/* 节点定义 */
struct Node
{
Node* childL;
Node* childR;
int key;
int val;
int h; //节点高度
NodeType(int k, int v) :childL(nullptr), childR(nullptr), key(k), val(v), h(1) {}
}
/* 接口定义 */
class AVL
{
public:
AVL();
~AVL(); //析构时,释放节点空间
void Add(int key, int val); //添加一个元素
void Del(int key); //删除一个元素
Node* find(int key); //查找一个元素
void Size(); //查询元素数
void IsEmpty(); //AVL 是否空
private:
void RotateL(Node* &node); // 左旋
void RotateR(Node* &node); // 右旋
private:
int size;
Node *root; //AVL tree的根节点
}
②avl.c
#include"avl.h"
/* 接口实现 */
/*构造函数*/
AVL::AVL()
{
root = nullptr;
size = 0;
}
/*析构函数*/
AVL::~AVL()
{
/*采用深度优先依次释放各个节点*/
if(!root) return;
stack<Node*> s;
s.push(root);
Node *cur = nullptr;
while(!s.empty()) {
cur = s.top();
if (cur->childL) {
s.push(cur->childL);
cur->childL = nullptr;
} else if (cur->childR) {
s.push(cur->childR);
cur->childR = nullptr;
} else {
s.pop();
delete cur;
}
}
}