diff --git a/src/binarytree.c b/src/binarytree.c index fa0bbfd..68b7ad2 100644 --- a/src/binarytree.c +++ b/src/binarytree.c @@ -1,8 +1,6 @@ #include #include -#include "../include/commons.h" - struct element { @@ -186,14 +184,22 @@ deleteElement(struct element ** tree, int data) void traverse(struct element * tree, void (*cb)(int, int)) { - struct element * previous = NULL; + struct element * previous = tree; struct element * node = tree; int depth = 1; - while (tree) { - if ((NULL == node->left || previous == node->left) && - previous != node->right) { + // I think this has something like O(n+log(n)) on a ballanced + // tree because I have to traverse back the rightmost leaf to + // the root to get a break condition. + while (node) { + if (previous == node->right) { + previous = node; + node = node->parent; + depth--; + continue; + } + if ((NULL == node->left || previous == node->left)) { cb(node->data, depth); previous = node; @@ -201,33 +207,23 @@ traverse(struct element * tree, void (*cb)(int, int)) node = node->right; depth++; } else { - if (NULL == node->parent || node->parent->right == node) { - break; - } - node = node->parent; depth--; } } else { previous = node; - - if (previous == node->left || previous == node->right) { - node = node->parent; - depth--; - } else { - node = node->left; - depth++; - } + node = node->left; + depth++; } } } void printElement(int data, int depth) { - char format[250]; + int i; - sprintf(format, "%% %dd(%%d)\n", depth * 3); - printf(format, data, depth); + for (i=0; iparent : 0x0, + element ? element->left : 0x0, + element ? element->right : 0x0); + } puts("traverse"); traverse(root, printElement); - puts("\n"); return 0; }