taskrambler  0.1.9
Web server and task management solution.
destroy.c
Go to the documentation of this file.
1 /**
2  * \file
3  *
4  * \author Georg Hopp
5  *
6  * \copyright
7  * Copyright © 2012 Georg Hopp
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program. If not, see <http://www.gnu.org/licenses/>.
21  */
22 
23 #include "tree.h"
24 
25 void
26 treeDestroy(Tree * this, TreeAction action)
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 }
84 
85 // vim: set ts=4 sw=4:
void treeDestroy(Tree *this, TreeAction action)
Definition: destroy.c:26
#define TREE_RIGHT(node)
Definition: tree.h:28
#define TREE_PARENT(node)
Definition: tree.h:30
#define TREE_LEFT(node)
Definition: tree.h:29
void(* TreeAction)(const void *, const int)
Definition: tree.h:128