AVL树的实现例程
2014-03-28 08:28
169 查看
/* AVL树的节点声明 */ #ifndef _AVLTREE_H #define _AVLTREE_H struct AvlNode; typedef struct AvlNode *Position; typedef struct AvlNode *AvlTree; AvlTree MakeEmpty(AvlTree T); Position Find(ElementType X, AvlTree T); Position FindMin(AvlTree T); Position FindMax(AvlTree T); AvlTree Insert(ElementType X, AvlTree T); AvlTree Delete(ElementType X, AvlTree T); ElementType Retrieve(Position P); #endif /* _AVLTREE_H */ /* Place in the implementation file */ struct AvlNode { ElementType Element; AvlTree Left; AvlTree Right; int Height; };
/* 计算AVL节点的高度 */ static int Height(Position P) { if(P == NULL) return -1; else return P->Height; }
/* 向AVL树插入节点的例程 */ AvlTree Insert(ElementType X, AvlTree T) { if(T == NULL) { /* Create and return a one-node tree */ T = malloc(sizeof(struct AvlNode)); if(T == NULL) FatalError("Out of space!!!"); else { T->Element = X; T->Height = 0; T->Left = NULL; T->Right = NULL; } } else if(X < T->Element) { T->Left = Insert(X, T->Left); if(Height(T->Left) - Height(T->Right) == 2) { if(X < T->Left->Element) T = SingleRotateWithLeft(T); else T = DoubleRotateWithLeft(T); } } else if(X > T->Element) { T->Right = Insert(X, T->Right); if(Height(T->Right) - Height(T->Left) == 2) { if(X > T->Right->Element) T = SingleRotateWithRight(T); else T = DoubleRotateWithRight(T); } } /* Else X is in the tree already; we'll do nothing */ T->Height = Max(Height(T->Left), Height(T->Right)) + 1; return T; }
/* 执行单旋转的例程 */ static Postition SingleRotateWithLeft(Position K2) { Position K1; K1 = K2->left; K2->Left = K1->Right; K1->Right = K2; K2->Height = Max(Height(K2->Left), Height(K2->Right)) + 1; K1->Height = Max(Height(K1->Left), Height(K1->Left)) + 1; return K1; /* New root */ }
/* 执行双旋转的例程 */ static Position DoubleRotateWithLeft(Position K3) { /* Rotate between K1 and K2 */ K3->Left = SingleRotateWithLeft(K3->Left); /* Rotate between K3 and K2 */ return SingleRotateWithLeft(K3); }
附图:
单旋转
双旋转
相关文章推荐
- AVL树插入例程非递归实现C语言
- AVL树非递归实现插入和删除例程
- [置顶] 平衡树 AVL树的JAVA实现
- 调用OpenSSL实现数字签名功能例程(二)
- 利用ST提供的USB例程实现USB IAP功能
- AVL树实现与分析
- C++模板实现二叉树(七 AVL树的删除)
- 调用OpenSSL实现数字签名功能例程(一)
- VC实现串口通信例程 作者:阮帮秋
- 第1周 C语言及程序设计初步 例程-2 用switch语句实现多分支结构
- AVL树的创建--C语言实现
- AVL树的模板实现(增加了remove的方法)
- EmguCV学习之例程详解(02):仅用5行代码实现的摄像头监视
- AVL树的代码实现
- AVL树-scala实现
- 监控文件夹功能实现例程
- 用java实现二分法快速查找例程
- AVL树的实现
- 乘法器的实现--对流水线操作理解的最好的例程
- Java中线程实现的两种方式例程