taskrambler
0.1.8
Web server and task management solution.
Main Page
Related Pages
Data Structures
Files
File List
Globals
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:
treeDestroy
void treeDestroy(Tree *this, TreeAction action)
Definition:
destroy.c:26
TREE_RIGHT
#define TREE_RIGHT(node)
Definition:
tree.h:28
TREE_PARENT
#define TREE_PARENT(node)
Definition:
tree.h:30
tree.h
TREE_LEFT
#define TREE_LEFT(node)
Definition:
tree.h:29
TreeAction
void(* TreeAction)(const void *, const int)
Definition:
tree.h:128
src
tree
destroy.c
Generated on Wed Apr 13 2016 15:12:24 for taskrambler by
1.8.10