Skip to content

Commit d7279c6

Browse files
author
tiberius
committed
further tree development
1 parent 33ac543 commit d7279c6

File tree

4 files changed

+123
-22
lines changed

4 files changed

+123
-22
lines changed

cpp4j/testTemplates.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ using namespace std;
3030
//template class Pair<int,string>;
3131
//template class Tree< int,Less<int> >;
3232
//template class Map<int, string>;
33-
/*
33+
3434
// list and count all nodes in a set using an iterator
3535
template<class Container>
3636
int printAndCount(Container & c) {
@@ -56,7 +56,7 @@ int printAndCountBackwards(Container & c) {
5656
}
5757
cout << endl;
5858
return n;
59-
}*/
59+
}
6060

6161
int testTemplates(void)
6262
{
@@ -97,15 +97,12 @@ int testTemplates(void)
9797
// TEST TREE
9898

9999

100-
Tree<int> t;
101100

102-
#if 0 // move this line down while your implementation proceeds...
103101
// construct empty tree
104102
Tree<int> t;
105103
cout << "empty tree: ";
106104
assert(printAndCount(t) == 0);
107-
108-
105+
cout.flush();
109106

110107
// insert elements in a certain order
111108
t.insert(4);
@@ -116,6 +113,9 @@ int testTemplates(void)
116113
cout << "tree 4-3-2-1-5: ";
117114
assert(printAndCount(t) == 5);
118115

116+
117+
#if 0 // move this line down while your implementation proceeds...
118+
119119
// test clear()
120120
t.clear();
121121
cout << "after clear(): ";

cpp4j/tree.h

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,86 @@
22
#define TREE_H
33

44
#include "less.h"
5+
#include "treeiterator.h"
56
#include "treenode.h"
67

78
template <class T, template<typename> class Order = Less > class Tree {
89

10+
public:
11+
12+
Tree():m_root(NULL) {}
13+
14+
typedef TreeIterator<T,Order> iterator;
15+
typedef TreeNode<T,Order> node;
16+
17+
iterator insert(const T& value) {
18+
if (m_root == NULL) {
19+
m_root = new node(value);
20+
return iterator(m_root, this);
21+
22+
} else {
23+
iterator i (m_root, this);
24+
return insert_internal (i, value);
25+
26+
}
27+
}
28+
29+
//void clear();
30+
iterator begin() {
31+
if (m_root == NULL)
32+
return iterator(NULL, this);
33+
34+
return iterator (m_root->findFirst(), this);
35+
}
36+
37+
iterator end() {
38+
if (m_root == NULL)
39+
return iterator(NULL, this);
40+
41+
return iterator (m_root->findLast(), this);
42+
}
43+
44+
/*iterator first();
45+
iterator last();
46+
iterator find(const T& value);*/
47+
48+
949
private:
10-
TreeNode<T, Order> m_root;
50+
TreeNode<T, Order> * m_root;
51+
52+
iterator insert_internal(iterator i, const T& value) {
53+
Order<T> order;
54+
55+
if (order(value, i.m_node->m_value)) { // links
56+
iterator prev = iterator (i.m_node->m_left, this);
57+
if (prev.m_node == NULL) {
58+
prev.m_node = new node(value);
59+
prev.m_node->m_up = i.m_node;
60+
i.m_node->m_left = prev.m_node;
61+
return prev;
62+
63+
} else
64+
return insert_internal (prev, value);
65+
66+
67+
} else if (order(i.m_node->m_value, value)) { // rechts
68+
iterator next = iterator (i.m_node->m_right, this);
69+
if (next.m_node == NULL) {
70+
next.m_node = new node(value);
71+
next.m_node->m_up = i.m_node;
72+
i.m_node->m_left = next.m_node;
73+
return next;
74+
75+
} else
76+
return insert_internal (next, value);
77+
78+
79+
} else {
80+
i.m_node->m_value = value;
81+
return i;
82+
}
83+
}
84+
1185

1286
};
1387

cpp4j/treeiterator.h

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
#ifndef TREEITERATOR_H
22
#define TREEITERATOR_H
33

4-
#include "tree.h"
54
#include "treenode.h"
65

6+
template <class T, template<typename> class Order > class Tree;
7+
78
template <class T, template<typename> class Order > class TreeIterator {
89

9-
friend class TreeNode<T, Order>;
10+
friend class Tree<T, Order>;
1011

1112
public:
1213

13-
TreeIterator(TreeNode<T, Order> node) : m_node(node) {}
14-
1514
T& operator*() {
1615
return m_node->value();
1716
}
@@ -20,13 +19,16 @@ template <class T, template<typename> class Order > class TreeIterator {
2019
return m_node->value();
2120
}
2221

22+
// zum naechsten Element
2323
TreeIterator<T, Order>& operator++() {
2424
// erst rechts prüfen, ob vorhanden
2525
// ansonsten solange nach oben, bis größerer gefunden
26-
if (m_node->m_right != NULL)
27-
return TreeIterator(m_right);
26+
if (m_node->m_right != NULL) {
27+
m_node = m_node->m_right;
28+
return *this;
29+
}
2830

29-
TreeNode<T, Order> parent = m_node;
31+
TreeNode<T, Order> * parent = m_node;
3032

3133
Order<T> functor;
3234
do {
@@ -44,15 +46,16 @@ template <class T, template<typename> class Order > class TreeIterator {
4446
return *this;
4547
}
4648

49+
// zum vorherigen Element
4750
TreeIterator<T, Order>& operator--() {
4851
if (m_node->m_left != NULL) {
4952
TreeNode<T, Order> node = m_node.m_left;
5053
while (node->m_right != NULL)
51-
node = m_right;
54+
node = node->m_right;
5255

5356
m_node = node;
5457
} else if (m_node->m_up != NULL) {
55-
TreeNode<T, Order> parent = m_node;
58+
TreeNode<T, Order> * parent = m_node;
5659

5760
Order<T> functor;
5861
do {
@@ -69,19 +72,22 @@ template <class T, template<typename> class Order > class TreeIterator {
6972
return *this;
7073
}
7174

72-
bool operator==(const TreeIterator<T, Order> &rhs) {
73-
return this->m_node == rhs.m_node;
74-
75+
bool operator==(const TreeIterator<T, Order> &rhs) const {
76+
return this->m_node == rhs.m_node && this->m_tree == rhs.m_tree;
77+
}
7578

79+
bool operator!=(const TreeIterator<T, Order> &rhs) const {
80+
return this->m_node != rhs.m_node || this->m_tree != rhs.m_tree;
7681
}
7782

78-
bool operator!=(const TreeIterator<T, Order> &rhs);
83+
protected:
7984

85+
TreeIterator(TreeNode<T, Order> * node, const Tree<T, Order> * tree) : m_node(node), m_tree(tree) {}
8086

8187
private:
8288

8389
TreeNode<T, Order> * m_node;
84-
Tree<T, Order> * m_tree;
90+
const Tree<T, Order> * m_tree;
8591

8692
};
8793

cpp4j/treenode.h

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
#ifndef TREENODE_H
22
#define TREENODE_H
33

4+
template <class T, template<typename> class Order > class Tree;
5+
template <class T, template<typename> class Order > class TreeIterator;
6+
47
template <class T, template<typename> class Order > class TreeNode {
58

9+
friend class Tree<T, Order>;
10+
friend class TreeIterator<T, Order>;
11+
612
public:
713

814
T& value(void) {
@@ -38,14 +44,29 @@ template <class T, template<typename> class Order > class TreeNode {
3844
return this;
3945
}
4046

47+
/*bool operator==(const TreeNode<T, Order> &rhs) const {
48+
return this->m_value == rhs.m_value
49+
&& this->m_up == rhs.m_up
50+
&& this->m_left == rhs.m_left
51+
&& this->m_right == rhs.m_right;
52+
}*/
53+
54+
4155
protected:
4256

43-
TreeNode<T, Order> * self;
4457
T m_value;
4558
TreeNode<T, Order>* m_up;
4659
TreeNode<T, Order>* m_left;
4760
TreeNode<T, Order>* m_right;
4861

62+
// create a leaf node
63+
TreeNode<T, Order>(const T value, TreeNode<T, Order> * up = NULL)
64+
: m_value(value), m_up(up), m_left(NULL), m_right(NULL) {}
65+
66+
// create a branch node
67+
TreeNode<T, Order>(const T value, TreeNode<T, Order> * up, TreeNode<T, Order> * left, TreeNode<T, Order> * right)
68+
: m_value(value), m_up(up), m_left(left), m_right(right) {}
69+
4970
};
5071

5172
#endif // TREENODE_H

0 commit comments

Comments
 (0)