原理:用一个栈把插入和删除时搜索路径记录下来,按照一般二叉树执行了插入,删除操作后再原路返回,修改高度信息和进行旋转操作使满足AVL平衡条件。
//AVL树模板(部分)
#ifndef AVLTree_h
#define AVLTree_h
#include <iostream>
#include <stack> //记录删除时遍历路径
template<typename Comparable>
class AVLTree
{
private:
struct AvlNode //树结点的定义
{
Comparable element;
AvlNode *left;
AvlNode *right;
int height;
AvlNode(const Comparable &theElement,AvlNode *lt=NULL,AvlNode *rt=NULL,int h=0)
:element(theElement),left(lt),right(rt),height(h){}
};
AvlNode *root; //根节点的声明
inline int max(int a,int b) //计算两整数最大值,在算树高度时总是用到
{
if(a>b)return a;
else return b;
}
inline int height(AvlNode *t)const //计算高度
{
return NULL==t ? -1 :t->height;
}
void adjust(AvlNode *&t) //调整使符合AVL条件
{
if(height(t->left)-height(t