Skip to content

Commit 6307c49

Browse files
author
tiberius
committed
further tree implementation
1 parent 5825053 commit 6307c49

File tree

3 files changed

+51
-10
lines changed

3 files changed

+51
-10
lines changed

cpp4j/testTemplates.cpp

Lines changed: 7 additions & 3 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
{
@@ -96,12 +96,16 @@ int testTemplates(void)
9696
/////////////////////////////////////////
9797
// TEST TREE
9898

99+
100+
Tree<int> t;
101+
102+
#if 0 // move this line down while your implementation proceeds...
99103
// construct empty tree
100104
Tree<int> t;
101105
cout << "empty tree: ";
102106
assert(printAndCount(t) == 0);
103107

104-
#if 0 // move this line down while your implementation proceeds...
108+
105109

106110
// insert elements in a certain order
107111
t.insert(4);

cpp4j/tree.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
#define TREE_H
33

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

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

9+
private:
810
TreeNode<T, Order> m_root;
911

1012
};

cpp4j/treeiterator.h

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#ifndef TREEITERATOR_H
22
#define TREEITERATOR_H
33

4+
#include "tree.h"
45
#include "treenode.h"
56

67
template <class T, template<typename> class Order > class TreeIterator {
@@ -12,11 +13,11 @@ template <class T, template<typename> class Order > class TreeIterator {
1213
TreeIterator(TreeNode<T, Order> node) : m_node(node) {}
1314

1415
T& operator*() {
15-
return m_node->m_value;
16+
return m_node->value();
1617
}
1718

1819
T* operator->() {
19-
return (T*)(m_node->m_value&);
20+
return m_node->value();
2021
}
2122

2223
TreeIterator<T, Order>& operator++() {
@@ -25,28 +26,62 @@ template <class T, template<typename> class Order > class TreeIterator {
2526
if (m_node->m_right != NULL)
2627
return TreeIterator(m_right);
2728

28-
TreeNode<T, Order> parent = m_node->m_up;
29+
TreeNode<T, Order> parent = m_node;
2930

3031
Order<T> functor;
31-
while (functor(m_node->m_value, parent->value)) {
32+
do {
33+
3234
parent = parent->m_up;
33-
}
35+
36+
// keep position
37+
if (parent == NULL)
38+
return *this;
39+
40+
41+
} while (functor(m_node->m_value, parent->m_value));
3442

3543
m_node = parent;
3644
return *this;
3745
}
3846

3947
TreeIterator<T, Order>& operator--() {
48+
if (m_node->m_left != NULL) {
49+
TreeNode<T, Order> node = m_node.m_left;
50+
while (node->m_right != NULL)
51+
node = m_right;
52+
53+
m_node = node;
54+
} else if (m_node->m_up != NULL) {
55+
TreeNode<T, Order> parent = m_node;
56+
57+
Order<T> functor;
58+
do {
59+
parent = parent->m_up;
60+
// keep position
61+
if (parent == NULL)
62+
return *this;
63+
64+
} while (functor(m_node->m_value, parent->m_value));
65+
66+
m_node=parent;
67+
}
68+
69+
return *this;
70+
}
71+
72+
bool operator==(const TreeIterator<T, Order> &rhs) {
73+
return this->m_node == rhs.m_node;
74+
4075

4176
}
4277

43-
bool operator==(const TreeIterator<T, Order> &rhs);
4478
bool operator!=(const TreeIterator<T, Order> &rhs);
4579

4680

4781
private:
4882

49-
TreeNode<T, O> m_node;
83+
TreeNode<T, Order> m_node;
84+
Tree<T, Order> m_tree;
5085

5186
};
5287

0 commit comments

Comments
 (0)