@@ -21,128 +21,75 @@ template <class T, template<typename> class Order > class TreeIterator {
21
21
22
22
// zum nächsten Element
23
23
TreeIterator<T, Order>& operator ++() {
24
- if (m_node == NULL || m_mode == end) {
24
+ if (m_node == NULL || m_end)
25
25
return *this ;
26
- }
27
-
28
- m_mode = middle;
29
-
30
- //
31
- // Was kann sonst sein?
32
- //
33
26
34
- // versuche, nach links zu gehen
35
- if (m_node->m_left != NULL ) {
36
- m_node = m_node->m_left ;
37
- return *this ;
38
- }
39
-
40
- // wenn links nicht moeglich, versuche nach rechts zu gehen
41
27
if (m_node->m_right != NULL ) {
42
28
m_node = m_node->m_right ;
29
+ while (m_node->m_left != NULL )
30
+ m_node = m_node->m_left ;
31
+
43
32
return *this ;
44
33
}
45
34
46
- // wenn rechts nicht moeglich, versuche so weit nach oben zu gehen, dass du einen neuen rechten Weg hast
47
- TreeNode<T, Order> * child = m_node;
48
- TreeNode<T, Order> * parent = child->m_up ;
35
+ if (m_node->m_up != NULL ) {
36
+ if (m_node->m_up ->m_left == m_node) {
37
+ // wir kamen von links
38
+ m_node = m_node->m_up ;
39
+ return *this ;
40
+ }
49
41
50
- while (parent != NULL ) {
42
+ TreeNode<T, Order> * node = m_node;
51
43
52
- // sind wir das linke Kind des Elter?
53
- if (child == parent-> m_left ) {
44
+ // wir kamen von rechts, also so lange nach oben, bis wir einen neuen rechten Pfad haben
45
+ while (node-> m_up -> m_right == node ) {
54
46
55
- // haben wir Geschwister?
56
- if (parent->m_right != NULL ) {
47
+ node = node->m_up ;
57
48
58
- // naechster gefunden
59
- m_node = parent-> m_right ;
49
+ if (node-> m_up == NULL ) { // reached root, nothing else to do
50
+ m_end = true ;
60
51
return *this ;
61
52
}
62
- }
63
53
64
- // wir sind nicht das linke Kind (sondern das rechte)
65
- child = parent;
66
- parent = parent->m_up ;
67
- }
54
+ }
68
55
69
- // wenn nichts moeglich ist, sind wir bereits am Ende
70
- m_mode = end;
71
- return *this ;
72
- }
56
+ m_node = node->m_up ;
73
57
74
- // zum vorherigen Element
75
- TreeIterator<T, Order>& operator --() {
76
- if (m_node == NULL || m_mode == begin) {
77
58
return *this ;
78
- }
79
-
80
- m_mode = middle;
81
-
82
- //
83
- // Was kann sonst sein?
84
- //
85
59
86
- // wenn rechts nicht moeglich, versuche so weit nach oben zu gehen, dass du einen neuen rechten Weg hast
87
- TreeNode<T, Order> * child = m_node;
88
- TreeNode<T, Order> * parent = child->m_up ;
89
-
90
- while (parent != NULL ) {
91
-
92
- // sind wir das linke Kind des Elter?
93
- if (child == parent->m_right ) {
94
-
95
- // haben wir Geschwister?
96
- if (parent->m_left != NULL ) {
97
-
98
- // naechster gefunden
99
- m_node = parent->m_left ;
100
- return *this ;
101
- }
102
- }
103
-
104
- // wir sind nicht das linke Kind (sondern das rechte)
105
- child = parent;
106
- parent = parent->m_up ;
107
60
}
108
61
109
- // wenn links nicht moeglich, versuche nach rechts zu gehen
110
- if (m_node->m_left != NULL ) {
111
- m_node = m_node->m_left ;
112
- return *this ;
113
- }
62
+ m_end = true ;
63
+ return *this ;
114
64
115
- // versuche, nach links zu gehen
116
- if (m_node->m_right != NULL ) {
117
- m_node = m_node->m_right ;
118
- return *this ;
119
- }
65
+ }
120
66
121
- // wenn nichts moeglich ist, sind wir bereits am Ende
122
- m_mode = begin;
67
+ // zum vorherigen Element
68
+ TreeIterator<T, Order>& operator --() {
123
69
return *this ;
124
70
}
125
71
126
72
bool operator ==(const TreeIterator<T, Order> &rhs) const {
127
- return this ->m_node == rhs.m_node && this ->m_tree == rhs.m_tree && this ->m_mode == rhs.m_mode ;
73
+ return this ->m_node == rhs.m_node && this ->m_tree == rhs.m_tree && this ->m_end == rhs.m_end ;
128
74
}
129
75
130
76
bool operator !=(const TreeIterator<T, Order> &rhs) const {
131
- return !(this -> m_node == rhs. m_node && this -> m_tree == rhs. m_tree && this -> m_mode == rhs. m_mode );
77
+ return !(* this == rhs);
132
78
}
133
79
134
80
protected:
135
81
136
- enum iterator_mode { begin, middle, end };
137
- iterator_mode m_mode;
82
+ TreeIterator (TreeNode<T, Order> * node, const Tree<T, Order> * tree)
83
+ : m_node(node), m_tree(tree), m_end( false ) {}
138
84
139
- TreeIterator (TreeNode<T, Order> * node, const Tree<T, Order> * tree, const iterator_mode mode )
140
- : m_node(node), m_tree(tree), m_mode(mode ) {}
85
+ TreeIterator (TreeNode<T, Order> * node, const Tree<T, Order> * tree, const bool end )
86
+ : m_node(node), m_tree(tree), m_end(end ) {}
141
87
142
88
private:
143
89
144
90
TreeNode<T, Order> * m_node;
145
91
const Tree<T, Order> * m_tree;
92
+ bool m_end;
146
93
147
94
};
148
95
0 commit comments