#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); }