132 lines
3.9 KiB
C
132 lines
3.9 KiB
C
|
/** <plaintext>
|
||
|
*
|
||
|
* avl.h -- public types and external declarations for avl trees
|
||
|
*
|
||
|
* Created 03/01/89 by Brad Appleton
|
||
|
*
|
||
|
* ^{Mods:* }
|
||
|
*
|
||
|
* Fri Jul 14 13:54:12 1989, Rev 1.0, brad(0165)
|
||
|
*
|
||
|
**/
|
||
|
|
||
|
#ifndef AVL_H_INCLUDED
|
||
|
#define AVL_H_INCLUDED
|
||
|
|
||
|
/* definition of traversal type */
|
||
|
typedef enum { PREORDER, INORDER, POSTORDER } VISIT;
|
||
|
|
||
|
|
||
|
/* definition of sibling order type */
|
||
|
typedef enum { LEFT_TO_RIGHT, RIGHT_TO_LEFT } SIBLING_ORDER;
|
||
|
|
||
|
|
||
|
/* definition of node type */
|
||
|
typedef enum { IS_TREE, IS_LBRANCH, IS_RBRANCH, IS_LEAF, IS_NULL } NODE;
|
||
|
|
||
|
/* definition of a NULL action and a NULL tree */
|
||
|
#define NULL_ACTION ((void(*)()) NULL)
|
||
|
#define NULL_TREE ((AVLtree) NULL)
|
||
|
|
||
|
|
||
|
/* BEGIN Internal definitions */
|
||
|
/* Directional Definitions */
|
||
|
typedef short DIRECTION;
|
||
|
#define LEFT 0
|
||
|
#define RIGHT 1
|
||
|
#define OPPOSITE(x) (1 - (x))
|
||
|
|
||
|
|
||
|
/* return codes used by avl_insert(), avl_delete(), and balance() */
|
||
|
#define HEIGHT_UNCHANGED 0
|
||
|
#define HEIGHT_CHANGED 1
|
||
|
|
||
|
|
||
|
/* Balance Definitions */
|
||
|
#define LEFT_HEAVY -1
|
||
|
#define BALANCED 0
|
||
|
#define RIGHT_HEAVY 1
|
||
|
#define LEFT_IMBALANCE(nd) ((nd)->bal < LEFT_HEAVY)
|
||
|
#define RIGHT_IMBALANCE(nd) ((nd)->bal > RIGHT_HEAVY)
|
||
|
|
||
|
|
||
|
/* structure for a node in an AVL tree */
|
||
|
typedef struct avl_node
|
||
|
{ struct avl_node *subtree[2]; /* LEFT and RIGHT subtrees */
|
||
|
short bal; /* balance factor */
|
||
|
void * data[1]; /* data on my back */
|
||
|
} AVLnode, *AVLtree;
|
||
|
|
||
|
/* End Internal definitions */
|
||
|
|
||
|
/* structure which holds information about an AVL tree */
|
||
|
typedef struct avl_tree
|
||
|
{ AVLtree root; /* pointer to the root node of the tree */
|
||
|
long count; /* number of nodes in the tree */
|
||
|
/* function used to compare keys */
|
||
|
void *client_data; /* arbitrary client data */
|
||
|
int (*compar)(void *l, void*r, NODE type);
|
||
|
void (*destroy)(void *data);
|
||
|
void* (*alloc)(void *cdata, size_t size);
|
||
|
void (*free)(void *cdata, void* data, size_t size);
|
||
|
int isize; /* item data size */
|
||
|
} avl_tree, *AVL_TREE;
|
||
|
|
||
|
#define AVL_ENUM_MAX 32 /* balanced tree, allows for 2**32 */
|
||
|
/* nodes */
|
||
|
|
||
|
typedef struct avl_enum
|
||
|
{ AVL_TREE tree;
|
||
|
int current;
|
||
|
AVLtree parents[AVL_ENUM_MAX];
|
||
|
} avl_enum;
|
||
|
|
||
|
void *avlfindfirst(AVL_TREE tree, void *key, avl_enum *e);
|
||
|
void *avlfindnext(avl_enum *e);
|
||
|
void avlfinddestroy(avl_enum *e);
|
||
|
|
||
|
/* Constructor and Destructor functions for AVL trees:
|
||
|
* avlfree is a macro for avldispose in the fashion
|
||
|
* of free(). It assumes certain default values
|
||
|
* (shown below) for the deallocation function and
|
||
|
* for the order in which children are traversed.
|
||
|
*/
|
||
|
extern AVL_TREE avlinit(AVL_TREE tree,
|
||
|
void *cdata, size_t isize,
|
||
|
int (*compare)(void *l, void*r, NODE type),
|
||
|
void (*destroy)(void *d),
|
||
|
void* (*alloc)(void *cdata, size_t bytes),
|
||
|
void (*free)(void *cdata, void *ptr, size_t size));
|
||
|
extern void avlfree(AVL_TREE tree);
|
||
|
|
||
|
/* Routine for manipulating/accessing each data item in a tree */
|
||
|
extern void avlwalk(AVL_TREE,
|
||
|
void (*action)(void *data,
|
||
|
SIBLING_ORDER order,
|
||
|
NODE type,
|
||
|
int level,
|
||
|
int balance),
|
||
|
SIBLING_ORDER);
|
||
|
|
||
|
|
||
|
/* Routine for obtaining the size of an AVL tree */
|
||
|
extern int avlcount(AVL_TREE);
|
||
|
|
||
|
|
||
|
/* Routines to search for a given item */
|
||
|
extern void *avlins(AVL_TREE tree, void *data);
|
||
|
extern int avldel(AVL_TREE tree, void *data);
|
||
|
extern void *avlfind(AVL_TREE tree, void *data);
|
||
|
|
||
|
|
||
|
/* Routines to search for the minimal item of a tree */
|
||
|
extern int avldelmin(AVL_TREE tree, void *data);
|
||
|
extern void *avlfindmin(AVL_TREE tree);
|
||
|
|
||
|
|
||
|
/* Routines to search for the maximal item of a tree */
|
||
|
extern int avldelmax(AVL_TREE tree, void *data);
|
||
|
extern void *avlfindmax(AVL_TREE tree);
|
||
|
|
||
|
#endif /* AVL_H_INCLUDED */
|