From 6500d9dac4a5cec8496981ca0c679540414208cb Mon Sep 17 00:00:00 2001 From: jf-home Date: Sun, 23 Jun 2024 16:41:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=B3=E5=AD=90=E6=A0=91?= =?UTF-8?q?=E4=BC=98=E5=85=88=E9=81=8D=E5=8E=86=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/tree.h | 4 +++ src/tree.c | 84 +++++++++++++++++++++++++++++++++++++++--------- test/tree_test.c | 15 +++++++++ 3 files changed, 88 insertions(+), 15 deletions(-) diff --git a/include/tree.h b/include/tree.h index c670151..f34bcfb 100644 --- a/include/tree.h +++ b/include/tree.h @@ -97,6 +97,8 @@ struct _tree uint32_t _capacity; // 总容量 uint32_t _ratio; // 扩展比率 + bool _right_priority; // 右优先 + // kernel bool (*insert)(struct _tree* self, void* obj); bool (*delete)(struct _tree* self, void* obj); @@ -123,6 +125,8 @@ struct _tree // ----- print ----- // traversal depth + void (*order)(struct _tree* self, bool right_priority); + void (*preorder)(struct _tree* self, struct _tree_node* root); void (*inorder)(struct _tree* self, struct _tree_node* root); void (*postorder)(struct _tree* self, struct _tree_node* root); diff --git a/src/tree.c b/src/tree.c index 54e0a1a..15793c8 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1585,46 +1585,97 @@ void tree_destory(struct _tree* self) self->_root = NULL; } +void tree_order(struct _tree* self, bool right_priority) +{ + assert(self != NULL); + self->_right_priority = right_priority; +} + void tree_avl_preorder(struct _tree* self, struct _tree_node* root) { assert(self != NULL); - self->print_obj(root->obj); - if(root->left != NULL) + if(!self->_right_priority) { - tree_avl_preorder(self, root->left); + self->print_obj(root->obj); + if(root->left != NULL) + { + tree_avl_preorder(self, root->left); + } + if(root->right != NULL) + { + tree_avl_preorder(self, root->right); + } } - if(root->right != NULL) + else { - tree_avl_preorder(self, root->right); + self->print_obj(root->obj); + if(root->right != NULL) + { + tree_avl_preorder(self, root->right); + } + if(root->left != NULL) + { + tree_avl_preorder(self, root->left); + } } } void tree_avl_inorder(struct _tree* self, struct _tree_node* root) { assert(self != NULL); - if(root->left != NULL) + if(!self->_right_priority) { - tree_avl_inorder(self, root->left); + if(root->left != NULL) + { + tree_avl_inorder(self, root->left); + } + self->print_obj(root->obj); + if(root->right != NULL) + { + tree_avl_inorder(self, root->right); + } } - self->print_obj(root->obj); - if(root->right != NULL) + else { - tree_avl_inorder(self, root->right); + if(root->right != NULL) + { + tree_avl_inorder(self, root->right); + } + self->print_obj(root->obj); + if(root->left != NULL) + { + tree_avl_inorder(self, root->left); + } } } void tree_avl_postorder(struct _tree* self, struct _tree_node* root) { assert(self != NULL); - if(root->left != NULL) + if(!self->_right_priority) { - tree_avl_postorder(self, root->left); + if(root->left != NULL) + { + tree_avl_postorder(self, root->left); + } + if(root->right != NULL) + { + tree_avl_postorder(self, root->right); + } + self->print_obj(root->obj); } - if(root->right != NULL) + else { - tree_avl_postorder(self, root->right); + if(root->right != NULL) + { + tree_avl_postorder(self, root->right); + } + if(root->left != NULL) + { + tree_avl_postorder(self, root->left); + } + self->print_obj(root->obj); } - self->print_obj(root->obj); } // traversal breadth @@ -1642,6 +1693,8 @@ bool tree_avl_init(struct _tree *self, uint32_t obj_size) // self->_capacity = 64; // self->_ratio = 2; + self->_right_priority = false; + self->insert = tree_avl_insert; self->delete = tree_avl_delete; self->clear = tree_clear; @@ -1652,6 +1705,7 @@ bool tree_avl_init(struct _tree *self, uint32_t obj_size) self->inorder = tree_avl_inorder; self->postorder = tree_avl_postorder; self->breadth = tree_avl_breadth; + self->order = tree_order; self->_root = NULL; diff --git a/test/tree_test.c b/test/tree_test.c index 2e4641b..e1dd2a9 100644 --- a/test/tree_test.c +++ b/test/tree_test.c @@ -299,6 +299,21 @@ void test_tree_num(void) tree->postorder(tree, tree->_root); printf("\n"); + printf("----- right priority -----\n"); + tree->order(tree, true); + + printf("----- preorder -----\n"); + tree->preorder(tree, tree->_root); + printf("\n"); + + printf("----- inorder -----\n"); + tree->inorder(tree, tree->_root); + printf("\n"); + + printf("----- postorder -----\n"); + tree->postorder(tree, tree->_root); + printf("\n"); + tree_free(tree); }