-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtree.cpp
125 lines (95 loc) · 3.32 KB
/
tree.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "tree.h"
#include "adjacency_list.h"
#include <iostream>
using namespace std;
// class TreeNode methods
TreeNode::TreeNode() : vertex_id(-1), vertex_weight(-1), next(NULL) {}
TreeNode::TreeNode(int v, int w) : vertex_id(v), vertex_weight(w), next(NULL) {}
int TreeNode::get_vertex_id() { return vertex_id; }
void TreeNode::set_vertex_id(int v) { vertex_id = v; }
int TreeNode::get_vertex_weight() { return vertex_weight; }
void TreeNode::set_vertex_weight(int w) { vertex_weight = w; }
TreeNode* TreeNode::get_next() { return next; }
void TreeNode::set_next(TreeNode* other) { next = other; }
// class Tree methods
Tree::Tree() : first(NULL), last(NULL), tree_size(0), total_weight(0) {}
Tree::Tree(Tree* other) {
TreeNode* temp;
TreeNode* next;
// we first delete the current tree
for (temp = first; temp != NULL; temp = temp->next) {
next = temp->next;
delete temp;
temp = next;
}
// now point ptrs to other tree and set size and weight
first = other->first;
last = other->last;
tree_size = other->tree_size;
total_weight = other->total_weight;
}
TreeNode* Tree::get_first() { return first; }
void Tree::set_first(TreeNode* other) { first = other; }
TreeNode* Tree::get_last() { return last; }
void Tree::set_last(TreeNode* other) { last = other; }
int Tree::get_tree_size() { return tree_size; }
int Tree::get_total_weight() { return total_weight; }
void Tree::set_total_weight(int sum) { total_weight = sum; }
void Tree::insert(int vertex_id, int vertex_weight) {
// if the vertex_id is already in tree, lets exclude it
TreeNode *ptr;
for(ptr = first; ptr != NULL; ptr = ptr->get_next()) {
if (vertex_id == ptr->vertex_id)
return;
}
TreeNode* p = new TreeNode;
p->vertex_id = vertex_id;
p->vertex_weight = vertex_weight;
if (tree_size == 0) {
first = p;
last = p;
tree_size = 1;
total_weight = vertex_weight;
} else {
last->next = p;
last = p;
tree_size += 1;
total_weight += vertex_weight;
}
}
void Tree::insert(Tree* &other) {
TreeNode *p;
for(p = other->get_first(); p != NULL; p = p->get_next()) {
// if the vertex_id is already in tree, lets exclude it
TreeNode *ptr;
for(ptr = first; ptr != NULL; ptr = ptr->get_next()) {
if (p->get_vertex_id() == ptr->vertex_id)
break;
}
if (ptr != NULL)
continue;
//cout << "Adding new node into tree, vertex = " << p->get_vertex_id();
//cout << ", weight = " << p->get_vertex_weight() << "\n";//DEBUG
TreeNode* temp = new TreeNode(p->get_vertex_id(), p->get_vertex_weight());
last->next = temp;
last = temp;
tree_size += 1;;
}
total_weight += other->get_total_weight();
}
void Tree::print_tree() {
TreeNode* p;
cout << "tree (id, wt) -";
for(p = first; p != NULL; p = p->get_next()) {
cout << " (" << p->get_vertex_id() << ", " << p->get_vertex_weight() << ")";
}
cout << "\n";
}
int Tree::find_total_weight(AdjacencyList &Graph) {
int sum = 0;
TreeNode* p;
for (p = first; p->get_next() != NULL; p = p->get_next()) {
sum += Graph.get_edge_weight(p->get_vertex_id(), p->get_next()->get_vertex_id());
}
return sum;
}