- 论坛徽章:
- 0
|
文件:AVL_ADT.c
- /*-----------------------------------------------------------
- AVL的ADT实现
- Author: QingXiaoming, 12-06, 2007([url]http://www.cublog.com/augustusqing/[/url]
- 您可以自由拷贝,修改,分发这份代码,但请注明原作者
- -------------------------------------------------------------*/
- #include <iostream>
- #include <cstdlib>
- #include "include/AVL_ADT.h"
- #define EH 0
- #define LH 1
- #define RH -1
- #define TRUE 1
- #define FALSE 0
- struct AVLNode {
- public:
- AVLNode(Item);
- Item item;
- AVLTree lchild;
- AVLTree rchild;
- int bh;
- };
- AVLNode::AVLNode(Item t)
- {
- item = t;bh = EH;
- lchild = rchild = NULL;
- }
- static void showAVLTreeNode(AVLTree tree);
- static void Left_Rotate(AVLTree & tree);
- static void Right_Rotate(AVLTree & tree);
- static int Left_Balance(AVLTree & tree);
- static int Right_Balance(AVLTree & tree);
- static int deleteavl(AVLTree & tree, AVLTree link, int & shorter);
- static AVLTree deleteAVLNode(AVLTree & tree, Item item);
- AVLTree initAVL()
- {
- return NULL;
- }
- int emptyAVL(AVLTree tree)
- {
- return tree == NULL;
- }
- inline static void showAVLTreeNode(AVLTree tree)
- {
- Item t;
- std::cout << "Item: " << tree->item << " BH: " << tree->bh << " ";
- if (NULL == tree->lchild && NULL == tree->rchild)
- {
- std::cout << std::endl;
- return;
- }
- if (tree->lchild )
- {
- t = tree->lchild->item;
- std::cout << " Lchild: " << t << " ";
- }
- if (tree->rchild)
- {
- t = tree->rchild->item;
- std::cout << " Rchild: " << t << " " << std::endl;
- }
- else
- {
- std::cout << std::endl;
- }
- }
- void pretravseAVL(AVLTree tree)
- {
- if (tree)
- {
- showAVLTreeNode(tree);
- pretravseAVL(tree->lchild);
- pretravseAVL(tree->rchild);
- }
- }
- void midtravseAVL(AVLTree tree)
- {
- if (tree)
- {
- midtravseAVL(tree->lchild);
- showAVLTreeNode(tree);
- midtravseAVL(tree->rchild);
- }
- }
- Item minAVL(AVLTree tree)
- {
- if (tree)
- {
- while (tree->lchild)
- {
- tree = tree->lchild;
- }
- return tree->item;
- }
- else return -1;
- }
- Item maxAVL(AVLTree tree)
- {
- if (tree)
- {
- while (tree->rchild)
- {
- tree = tree->rchild;
- }
- return tree->item;
- }
- else return -1;
- }
- AVLTree findAVL(AVLTree tree, Item item)
- {
- while (NULL != tree && item != tree->item)
- {
- tree = (item < tree->item) ? tree->lchild : tree->rchild;
- }
- return tree;
- }
- int insertAVL(AVLTree & tree, Item item, int &taller)
- {
- int tall;
- taller = FALSE;//also should give the default value
- if (!tree)
- {
- tree = new AVLNode(item);
- taller = TRUE;
- return 1;
- }
- if (item == tree->item)
- {
- taller = FALSE; return 0;
- }
- else if (item < tree->item)
- {
- if (!insertAVL(tree->lchild, item, tall)) return 0;
- if (tall)
- {
- switch (tree->bh)
- {
- case EH:
- taller = TRUE; tree->bh = LH; break;
- case RH:
- taller = FALSE; tree->bh = EH; break;
- case LH:
- taller = FALSE; Left_Balance(tree); break;
- }
- }
- }
- else
- {
- if (!insertAVL(tree->rchild, item, tall)) return 0;
- if (tall)
- {
- switch (tree->bh)
- {
- case EH:
- taller = TRUE; tree->bh = RH; break;
- case LH:
- taller = FALSE; tree->bh = EH; break;
- case RH:
- taller = FALSE; Right_Balance(tree); break;
- }
- }
- }
- return 1;
- }
- static void Left_Rotate(AVLTree & tree)
- {
- assert(NULL != tree->rchild);//assert to assure the valid
- AVLTree rc = tree->rchild;
- tree->rchild = rc->lchild;
- rc->lchild = tree;
- tree = rc;
- }
- static void Right_Rotate(AVLTree & tree)
- {
- assert(NULL != tree->lchild);//assert to assure the valid
- AVLTree lc = tree->lchild;
- tree->lchild = lc->rchild;
- lc->rchild = tree;
- tree = lc;
- }
- static int Left_Balance(AVLTree & tree)
- {
- int shorter;//this just for delete action, to tell the delete action whether this balance action shotter
- assert(NULL != tree && NULL != tree->lchild);//assert to assure the valid
- AVLTree lc = tree->lchild, rd;
- switch (lc->bh)
- {
- case LH:
- lc->bh = EH; tree->bh = EH;
- Right_Rotate(tree);
- shorter = 1;
- break;
- case RH:
- rd = lc->rchild;
- switch (rd->bh)
- {
- case EH:
- tree->bh = EH; lc->bh = EH;
- break;
- case LH:
- tree->bh = RH; lc->bh = EH;
- break;
- case RH:
- tree->bh = EH; lc->bh = LH;
- break;
- }
- rd->bh = EH;
- Left_Rotate(tree->lchild);
- Right_Rotate(tree);
- shorter = 1;
- break;
- /*
- when insert , this case will not be ture, it just for delete action
- */
- case EH:
- lc->bh = RH; tree->bh = LH;
- Right_Rotate(tree);
- shorter = 0;
- break;
- }
- return shorter;
- }
- static int Right_Balance(AVLTree & tree)
- {
- int shorter;//this just for delete action, to tell the delete action whether this balance action shotter
- assert(NULL != tree && NULL != tree->rchild);//assert to assure the valid
- AVLTree rc = tree->rchild, ld;
- switch (rc->bh)
- {
- case RH:
- rc->bh = EH; tree->bh = EH; shorter = 1;
- Left_Rotate(tree);
- break;
- case LH:
- ld = rc->lchild;
- switch (ld->bh)
- {
- case EH:
- tree->bh = EH; rc->bh = EH;
- break;
- case LH:
- tree->bh = EH; rc->bh = RH;
- break;
- case RH:
- tree->bh = LH; rc->bh = EH;
- break;
- }
- ld->bh = EH;
- Right_Rotate(tree->rchild);
- Left_Rotate(tree);
- shorter = 1;
- break;
- /*
- when insert , this case will not be ture, it just for delete action
- */
- case EH:
- rc->bh = LH; tree->bh = RH;
- Left_Rotate(tree);
- shorter = 0;
- break;
- }
- return shorter;
- }
- static int deleteavl(AVLTree & tree, AVLTree link, int & shorter)
- {
- int sht;
- shorter = FALSE;//forget give this default value
- //case: only two node, root and his lchild, delete the root node
- //Only this case, the link will not be a leaves node
- if (link == tree && tree->lchild)
- {
- tree = link->lchild;
- shorter = TRUE;
- return 1;
- }
- if (link == tree)
- {
- tree = link->rchild;
- shorter = TRUE;
- return 1;
- }
-
- if (link->item < tree->item)
- {
- deleteavl(tree->lchild, link, sht);
- if (sht)
- {
- switch (tree->bh)
- {
- case EH:
- tree->bh = RH; shorter = FALSE; break;
- case LH:
- tree->bh = EH; shorter = TRUE; break;
- case RH:
- shorter = Right_Balance(tree); break;
- }
- }
- }
- else
- {
- deleteavl(tree->rchild, link, sht);
- if (sht)
- {
- switch (tree->bh)
- {
- case EH:
- tree->bh = LH; shorter = FALSE; break;
- case RH:
- tree->bh = EH; shorter = TRUE; break;
- case LH:
- shorter = Left_Balance(tree); break;
- }
- }
- }
- return 1;
- }
- static AVLTree deleteAVLNode(AVLTree & tree, Item item)
- {
- int shorter;
- Item t;
- AVLTree y, x = findAVL(tree, item);
- if (!x){std::cerr << "Cant delete Non Exist Node from a AVL Tree" << std::endl;return NULL;}
- if (x->rchild)
- {
- y = x->rchild;
- while (y->lchild)
- {
- y = y->lchild;
- }
- }
- else
- {
- y = x;
- }
- deleteavl(tree, y, shorter);
- if (y != x)
- {
- t = x->item; x->item = y->item; y->item = t;
- }
- return y;
- }
- int deleteAVL(AVLTree & tree, Item item)
- {
- AVLTree x = deleteAVLNode(tree, item);
- if (x)
- {
- delete x;
- return 1;
- }
- else
- {
- return 0;
- }
- }
- void destroyAVL(AVLTree & tree)
- {
- Item min = minAVL(tree);
- AVLTree x;
- while (!emptyAVL(tree))
- {
- x = deleteAVLNode(tree, min);
- showAVLTreeNode(x);
- delete x;
- min = minAVL(tree);
- }
- }
复制代码
文件: AVL_ADT_user.c
- /*-----------------------------------------------------------
- AVL的ADT用户程序
- Author: QingXiaoming, 12-06, 2007([url]http://www.cublog.com/augustusqing/[/url]
- 您可以自由拷贝,修改,分发这份代码,但请注明原作者
- -------------------------------------------------------------*/
- #include <iostream>
- #include "include/AVL_ADT.h"
- int main(int argc, char *argv[])
- {
- int i, N = atoi(argv[1]);
- Item t;
- int taller;
- long start, stop;
- //AVLTree x = NULL;
- AVLTree tree = initAVL();
- int *a = new int[N];
- start = clock();
- for (i = 0; i < N; i++)
- {
- t = rand();
- a[i] = t;
- //std::cout << t << std::endl;
- insertAVL(tree, t, taller);
- }
- //pretravseAVL(tree);
- //std::cout << std::endl;
- //midtravseAVL(tree);
- std::cout << std::endl;
-
- for (i = 0; i < N; i++)
- {
- t = a[i];
- //std::cout << t << std::endl;
- //pretravseAVL(tree);
- //std::cout << std::endl;
- deleteAVL(tree, t);
- //midtravseAVL(tree);
- //std::cout << std::endl;
- }
- //std::cout << "Tree state " << emptyAVL(tree) << std::endl;
- destroyAVL(tree);
- std::cout << "Tree state " << emptyAVL(tree) << std::endl;
- stop = clock();
- std::cout << stop - start << std::endl;
- delete []a;
- return 0;
- }
复制代码 |
|