1 /************************** toolbox/tree.c *************************************
3 Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
5 See file COPYRIGHT for information on usage and disclaimer of warranties
7 Not documented, see tree.h.
9 Authors: Reinhard Grafl EMAIL: cacao@complang.tuwien.ac.at
11 Last Change: 1996/10/03
13 *******************************************************************************/
23 tree *tree_new (treeelementcomperator comperator)
28 t -> comperator = comperator;
35 tree *tree_dnew (treeelementcomperator comperator)
37 tree *t = DNEW (tree);
40 t -> comperator = comperator;
48 static void tree_nodefree (treenode *tn)
51 tree_nodefree (tn -> left);
52 tree_nodefree (tn -> right);
56 void tree_free (tree *t)
58 assert (! t -> usedump);
60 tree_nodefree ( t -> top );
65 static treenode *tree_nodeadd
66 (tree *t, treenode *par, treenode *n, void *element, void *key)
69 if ( t-> usedump ) n = DNEW (treenode);
70 else n = NEW (treenode);
75 n -> element = element;
78 if ( t->comperator (key, n -> element) < 0 ) {
79 n -> left = tree_nodeadd (t, n, n -> left, element, key);
82 n -> right = tree_nodeadd (t, n, n -> right, element, key);
89 void tree_add (tree *t, void *element, void *key)
91 t -> top = tree_nodeadd (t, NULL, t -> top, element, key);
92 t -> active = t -> top;
96 static treenode *tree_nodefind (tree *t, treenode *n, void *key)
102 way = t -> comperator (key, n->element);
103 if (way==0) return n;
104 if (way<0) return tree_nodefind (t, n -> left, key);
105 else return tree_nodefind (t, n -> right, key);
109 void *tree_find (tree *t, void *key)
111 treenode *tn = tree_nodefind (t, t -> top, key);
112 if (!tn) return NULL;
115 return tn -> element;
120 void *tree_this (tree *t)
122 if (! t->active) return NULL;
123 return t->active->element;
127 static treenode *leftmostnode(treenode *t)
129 while (t->left) t=t->left;
133 void *tree_first (tree *t)
135 treenode *a = t->top;
138 a = leftmostnode (a);
143 void *tree_next (tree *t)
145 treenode *a = t->active;
146 treenode *comefrom = NULL;
151 if (a->left && (a->left == comefrom)) {
156 if (a->right && (a->right != comefrom) ) {
157 a = leftmostnode(a->right);