#include "tree.h"
treeNode::treeNode(char *id) {
value = strdup(id);
left = right = NULL;
}
treeNode::treeNode(FILE *f, int lo, int hi) {
left = right = NULL;
int mid = (lo + hi) / 2;
// First load this node
value = (char *)malloc(80);
fseek(f, mid*80, SEEK_SET);
fread(value, 80, 1, f);
value[79] = 0;
// Left node
if (mid - 1 >= lo) left = new treeNode(f, lo, mid - 1);
// Right node
if (mid + 1 <= hi) right = new treeNode(f, mid + 1, hi);
}
int treeNode::inTree(char *id) {
int res;
res = strcmp(id, value);
if (res == 0) return TRUE;
else if (res < 0) {
if (left) return left->inTree(id);
else { left = new treeNode(id); return FALSE; }
} else if (res > 0) {
if (right) return right->inTree(id);
else { right = new treeNode(id); return FALSE; }
}
}
void treeNode::saveNode(FILE *f) {
if (left) left->saveNode(f);
char tmp[80]; // Make sure string is 80 chars
strcpy(tmp, value);
tmp[79] = 0; // And does terminate.
fwrite(tmp,80,1,f);
if (right) right->saveNode(f);
}
void treeNode::printDepth(int d) {
if (!left && !right)
printf("Depth: %d\n",d);
else {
if(left)
left->printDepth(d+1);
if(right)
right->printDepth(d+1);
}
}
void treeNode::printNode() {
if (left) left->printNode();
printf("%s\n\r", value);
if (right) right->printNode();
}
void binaryTree::printTree() {
root->printNode();
}
int binaryTree::inTree(char *id) {
if (!id) return FALSE;
if (strlen(id) > 79) id[79] = 0;
if (root == NULL) { root = new treeNode(id); checkSave(); return FALSE; }
else {
if (root->inTree(id)) return TRUE;
else { checkSave(); return FALSE; }
}
}
void binaryTree::checkSave() {
addsSinceLastSave++;
if (addsSinceLastSave == 5) {
saveTree();
addsSinceLastSave = 0;
}
}
void binaryTree::saveTree() {
FILE *groupFile;
groupFile = fopen(groupName,"w");
if (root) root->saveNode(groupFile);
fclose(groupFile);
}
void binaryTree::loadTree() {
FILE *groupFile;
long fsize;
groupFile = fopen(groupName,"r");
if (groupFile) {
fseek(groupFile, 0, SEEK_END);
fsize = ftell(groupFile) / 80;
root = new treeNode(groupFile, 0, fsize-1);
fclose(groupFile);
}
}
void binaryTree::printDepth() {
if( root )
root->printDepth(1);
}
syntax highlighted by Code2HTML, v. 0.9.1