原理:用一个栈把插入和删除时搜索路径记录下来,按照一般二叉树执行了插入,删除操作后再原路返回,修改高度信息和进行旋转操作使满足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->right)==2)
if(height(t->left->right)<height(t

本文介绍了如何非递归地在AVL树中实现元素的插入和删除。通过使用栈来记录搜索路径,首先按照普通二叉树的方式执行操作,然后在回溯过程中更新节点的高度信息,并根据需要进行相应的旋转操作,以保持AVL树的平衡状态。
最低0.47元/天 解锁文章
448

被折叠的 条评论
为什么被折叠?



