diff options
Diffstat (limited to 'src/02/01/binary_tree.c')
| -rw-r--r-- | src/02/01/binary_tree.c | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/src/02/01/binary_tree.c b/src/02/01/binary_tree.c index 7cdd197..24bdccd 100644 --- a/src/02/01/binary_tree.c +++ b/src/02/01/binary_tree.c @@ -9,31 +9,30 @@ Node *initialize(int data) { return item; } -void preorder_traversal(Node *node, Visitor visitor) { +void traverse(Node *node, Visitor visitor, enum Traversal traversal) { if (!node) return; - visitor(node); - preorder_traversal(node->left, visitor); - preorder_traversal(node->right, visitor); -} - -void inorder_traversal(Node *node, Visitor visitor) { - if (!node) - return; - - inorder_traversal(node->left, visitor); - visitor(node); - inorder_traversal(node->right, visitor); -} - -void postorder_traversal(Node *node, Visitor visitor) { - if (!node) - return; - - postorder_traversal(node->left, visitor); - postorder_traversal(node->right, visitor); - visitor(node); + switch (traversal) { + case PREORDER: + visitor(node); + traverse(node->left, visitor, traversal); + traverse(node->right, visitor, traversal); + break; + case INORDER: + traverse(node->left, visitor, traversal); + visitor(node); + traverse(node->right, visitor, traversal); + break; + case POSTORDER: + traverse(node->left, visitor, traversal); + traverse(node->right, visitor, traversal); + visitor(node); + break; + default: + visitor(node); + break; + } } static void destructor(Node *node) { @@ -41,5 +40,5 @@ static void destructor(Node *node) { } void destroy(Node *head) { - postorder_traversal(head, destructor); + traverse(head, destructor, POSTORDER); } |
