Skip to content

Commit b483dc5

Browse files
author
tiberius
committed
still not working
1 parent 6afc408 commit b483dc5

File tree

4 files changed

+144
-54
lines changed

4 files changed

+144
-54
lines changed

cpp4j/maptofirst.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include "pair.h"
55

66
// int string less
7-
template <class T1, class T2, template<typename> class Order > class MapToFirst {
7+
template <class T1, class T2, template<class> class Order > class MapToFirst {
88

99
public:
1010

cpp4j/testTemplates.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,10 @@ int testTemplates(void)
9696
/////////////////////////////////////////
9797
// TEST TREE
9898

99-
100-
10199
// construct empty tree
102100
Tree<int> t;
103101
cout << "empty tree: ";
104102
assert(printAndCount(t) == 0);
105-
cout.flush();
106103

107104
// insert elements in a certain order
108105
t.insert(4);
@@ -138,10 +135,18 @@ int testTemplates(void)
138135
cout << "6-element tree: ";
139136
assert(printAndCount(t) == 6);
140137

141-
#if 0 // move this line down while your implementation proceeds...
138+
// and yet another insertion sequence (compined from the above)
139+
t.clear();
140+
t.insert(8); t.insert(4); t.insert(3); t.insert(2); t.insert(1);
141+
t.insert(5); t.insert(1); t.insert(2); t.insert(3); t.insert(5);
142+
t.insert(4); t.insert(45); t.insert(4); t.insert(89); t.insert(9);
143+
t.insert(7); t.insert(3);
144+
cout << "10-element tree: ";
145+
assert(printAndCount(t) == 10);
142146

143147
// now we contruct a tree with a "reverse" order
144-
typedef Tree< float, Greater<float> > RevFloatTree;
148+
//typedef Tree< float, Greater<float> > RevFloatTree; // had to replace this line by the following
149+
typedef Tree< float, Greater > RevFloatTree;
145150
RevFloatTree ft;
146151
ft.insert(3.1);
147152
ft.insert(6.2);
@@ -155,6 +160,7 @@ int testTemplates(void)
155160
cout << "listing backwards: ";
156161
assert(printAndCountBackwards(ft) == 4);
157162

163+
#if 0 // move this line down while your implementation proceeds...
158164

159165
/////////////////////////////////////////
160166
// TEST MAP

cpp4j/tree.h

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,52 +5,77 @@
55
#include "treeiterator.h"
66
#include "treenode.h"
77

8-
template <class T, template<typename> class Order = Less > class Tree {
8+
template <class T, template<class> class Order = Less > class Tree {
99

1010
public:
1111

12-
Tree():m_root(NULL) {}
12+
Tree():m_root(NULL),m_last(NULL) {}
1313

1414
typedef TreeIterator<T,Order> iterator;
1515
typedef TreeNode<T,Order> node;
1616

1717
iterator insert(const T& value) {
18-
if (m_root == NULL) {
18+
19+
if (m_root == NULL && m_last == NULL) {
1920
m_root = new node(value);
20-
return iterator(m_root, this);
21+
reset_last();
22+
return iterator(m_root, this, iterator::begin);
2123

2224
} else {
23-
iterator i (m_root, this);
24-
return insert_internal (i, value);
25+
const iterator i (m_root, this, iterator::begin);
26+
iterator result = insert_internal (i, value);
27+
reset_last();
28+
return result;
2529

2630
}
2731
}
2832

2933
void clear() {
30-
m_root = NULL;
34+
// leaky-leaky
35+
m_last = m_root = NULL;
3136
}
3237

33-
iterator begin() {
34-
return iterator (m_root, this);
38+
const iterator begin() const {
39+
return iterator (m_root, this, m_root == NULL ? iterator::end : iterator::begin);
3540
}
3641

37-
iterator end() {
38-
return iterator (NULL, this);
42+
const iterator end() const {
43+
return iterator (m_last, this, iterator::end);
3944
}
4045

4146
/*iterator first();
4247
iterator last();
4348
iterator find(const T& value);*/
4449

4550

46-
private:
51+
protected:
4752
TreeNode<T, Order> * m_root;
53+
TreeNode<T, Order> * m_last;
54+
55+
void reset_last(void) {
56+
TreeNode<T, Order> * t = m_root;
57+
while (t != NULL) {
58+
59+
if (t->m_right == NULL) {
60+
if (t->m_left == NULL) {
61+
break;
62+
63+
} else {
64+
t = t->m_left;
65+
}
66+
67+
} else {
68+
t = t->m_right;
69+
}
70+
}
71+
m_last = t;
72+
}
4873

4974
iterator insert_internal(iterator i, const T& value) {
5075
Order<T> order;
5176

5277
if (order(value, i.m_node->m_value)) { // links
53-
iterator prev = iterator (i.m_node->m_left, this);
78+
iterator prev = iterator (i.m_node->m_left, this, iterator::middle);
5479
if (prev.m_node == NULL) {
5580
prev.m_node = new node(value);
5681
prev.m_node->m_up = i.m_node;
@@ -62,7 +87,7 @@ template <class T, template<typename> class Order = Less > class Tree {
6287

6388

6489
} else if (order(i.m_node->m_value, value)) { // rechts
65-
iterator next = iterator (i.m_node->m_right, this);
90+
iterator next = iterator (i.m_node->m_right, this, iterator::middle);
6691
if (next.m_node == NULL) {
6792
next.m_node = new node(value);
6893
next.m_node->m_up = i.m_node;
@@ -82,4 +107,6 @@ template <class T, template<typename> class Order = Less > class Tree {
82107

83108
};
84109

110+
111+
85112
#endif // TREE_H

cpp4j/treeiterator.h

Lines changed: 91 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -19,66 +19,125 @@ template <class T, template<typename> class Order > class TreeIterator {
1919
return m_node->value();
2020
}
2121

22-
// zum vorherigen Element
22+
// zum nächsten Element
2323
TreeIterator<T, Order>& operator++() {
24-
cout << m_node->m_value << endl;
25-
26-
if (m_node == NULL)
24+
if (m_node == NULL || m_mode == end) {
2725
return *this;
26+
}
2827

29-
if (m_node->m_left == NULL) {
30-
// nach rechts oder nach oben->rechts
28+
m_mode = middle;
3129

32-
// parent von node
33-
TreeNode<T, Order> * parent = m_node->m_up;
30+
//
31+
// Was kann sonst sein?
32+
//
3433

35-
// laufe nach oben, wenn du links vom oberen bist
36-
//if (parent->m_left == m_node) {
34+
// versuche, nach links zu gehen
35+
if (m_node->m_left != NULL) {
36+
m_node = m_node->m_left;
37+
return *this;
38+
}
3739

38-
// laufe nach oben, weil du links vom oberen bist
39-
parent = parent->m_up; // urelter
40+
// wenn links nicht moeglich, versuche nach rechts zu gehen
41+
if (m_node->m_right != NULL) {
42+
m_node = m_node->m_right;
43+
return *this;
44+
}
4045

41-
//
42-
while (parent != NULL && parent->m_up != NULL) {
43-
parent = parent->m_up;
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;
4449

45-
if (parent->m_right != NULL) {
46-
break;
47-
}
48-
}
50+
while (parent != NULL) {
51+
52+
// sind wir das linke Kind des Elter?
53+
if (child == parent->m_left) {
4954

50-
if (parent == NULL)
51-
m_node = NULL;
52-
else
55+
// haben wir Geschwister?
56+
if (parent->m_right != NULL) {
57+
58+
// naechster gefunden
5359
m_node = parent->m_right;
54-
//} else if (parent->m_right == m_node &&
60+
return *this;
61+
}
62+
}
5563

56-
// beende wenn du rechts von deinem oberen bist und unter dir nichts mehr ist
57-
return *this;
64+
// wir sind nicht das linke Kind (sondern das rechte)
65+
child = parent;
66+
parent = parent->m_up;
5867
}
5968

60-
// nach unten
61-
m_node = m_node->m_left;
69+
// wenn nichts moeglich ist, sind wir bereits am Ende
70+
m_mode = end;
6271
return *this;
6372
}
6473

65-
// zum naechsten Element
74+
// zum vorherigen Element
6675
TreeIterator<T, Order>& operator--() {
67-
}
76+
if (m_node == NULL || m_mode == begin) {
77+
return *this;
78+
}
79+
80+
m_mode = middle;
81+
82+
//
83+
// Was kann sonst sein?
84+
//
6885

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;
6989

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+
}
108+
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+
}
114+
115+
// versuche, nach links zu gehen
116+
if (m_node->m_right != NULL) {
117+
m_node = m_node->m_right;
118+
return *this;
119+
}
120+
121+
// wenn nichts moeglich ist, sind wir bereits am Ende
122+
m_mode = begin;
123+
return *this;
124+
}
70125

71126
bool operator==(const TreeIterator<T, Order> &rhs) const {
72-
return this->m_node == rhs.m_node && this->m_tree == rhs.m_tree;
127+
return this->m_node == rhs.m_node && this->m_tree == rhs.m_tree && this->m_mode == rhs.m_mode;
73128
}
74129

75130
bool operator!=(const TreeIterator<T, Order> &rhs) const {
76-
return this->m_node != rhs.m_node || this->m_tree != rhs.m_tree;
131+
return !(this->m_node == rhs.m_node && this->m_tree == rhs.m_tree && this->m_mode == rhs.m_mode);
77132
}
78133

79134
protected:
80135

81-
TreeIterator(TreeNode<T, Order> * node, const Tree<T, Order> * tree) : m_node(node), m_tree(tree) {}
136+
enum iterator_mode { begin, middle, end };
137+
iterator_mode m_mode;
138+
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) {}
82141

83142
private:
84143

@@ -87,6 +146,4 @@ template <class T, template<typename> class Order > class TreeIterator {
87146

88147
};
89148

90-
91-
92149
#endif // TREEITERATOR_H

0 commit comments

Comments
 (0)