taskrambler  v0.1.8
Web server and task management solution.
destroy.c File Reference
#include "tree.h"
+ Include dependency graph for destroy.c:

Go to the source code of this file.

Functions

void treeDestroy (Tree *this, TreeAction action)
 

Detailed Description

Author
Georg Hopp

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Definition in file destroy.c.

Function Documentation

void treeDestroy ( Tree *  this,
TreeAction  action 
)

Definition at line 26 of file destroy.c.

References TREE_LEFT, TREE_PARENT, and TREE_RIGHT.

Referenced by hashCleanup(), and main().

27 {
28  Tree previous = * this;
29  Tree node = * this;
30  int depth = 1;
31 
32  /*
33  * I think this has something like O(n+log(n)) on a ballanced
34  * tree because I have to traverse back the rightmost leaf to
35  * the root to get a break condition.
36  */
37  while (NULL != node) {
38  /*
39  * If we come from the right so nothing and go to our
40  * next parent.
41  */
42  if (((NULL == TREE_LEFT(node)
43  || previous == TREE_LEFT(node)) && NULL == TREE_RIGHT(node))
44  || previous == TREE_RIGHT(node)) {
45 
46  Tree parent = TREE_PARENT(node);
47 
48  action(node->data, depth);
49 
50  previous = node;
51  delete(node);
52  node = parent;
53  depth--;
54 
55  continue;
56  }
57 
58  if ((NULL == TREE_LEFT(node) || previous == TREE_LEFT(node))) {
59  /*
60  * If there are no more elements to the left or we
61  * came from the left, process data.
62  */
63  previous = node;
64 
65  if (NULL != TREE_RIGHT(node)) {
66  node = TREE_RIGHT(node);
67  depth++;
68  } else {
69  node = TREE_PARENT(node);
70  depth--;
71  }
72  } else {
73  /*
74  * if there are more elements to the left go there.
75  */
76  previous = node;
77  node = TREE_LEFT(node);
78  depth++;
79  }
80  }
81 
82  *this = NULL;
83 }
#define TREE_RIGHT(node)
Definition: tree.h:28
#define TREE_PARENT(node)
Definition: tree.h:30
#define TREE_LEFT(node)
Definition: tree.h:29

+ Here is the caller graph for this function: