添加右子树优先遍历的情况

This commit is contained in:
建峰 2024-06-23 16:41:03 +08:00
parent 6e953cb553
commit 6500d9dac4
3 changed files with 88 additions and 15 deletions

View File

@ -97,6 +97,8 @@ struct _tree
uint32_t _capacity; // ×ÜÈÝÁ¿ uint32_t _capacity; // ×ÜÈÝÁ¿
uint32_t _ratio; // À©Õ¹±ÈÂÊ uint32_t _ratio; // À©Õ¹±ÈÂÊ
bool _right_priority; // ÓÒÓÅÏÈ
// kernel // kernel
bool (*insert)(struct _tree* self, void* obj); bool (*insert)(struct _tree* self, void* obj);
bool (*delete)(struct _tree* self, void* obj); bool (*delete)(struct _tree* self, void* obj);
@ -123,6 +125,8 @@ struct _tree
// ----- print ----- // ----- print -----
// traversal depth // traversal depth
void (*order)(struct _tree* self, bool right_priority);
void (*preorder)(struct _tree* self, struct _tree_node* root); void (*preorder)(struct _tree* self, struct _tree_node* root);
void (*inorder)(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); void (*postorder)(struct _tree* self, struct _tree_node* root);

View File

@ -1585,46 +1585,97 @@ void tree_destory(struct _tree* self)
self->_root = NULL; 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) void tree_avl_preorder(struct _tree* self, struct _tree_node* root)
{ {
assert(self != NULL); assert(self != NULL);
self->print_obj(root->obj); if(!self->_right_priority)
if(root->left != NULL)
{ {
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) void tree_avl_inorder(struct _tree* self, struct _tree_node* root)
{ {
assert(self != NULL); 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); else
if(root->right != NULL)
{ {
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) void tree_avl_postorder(struct _tree* self, struct _tree_node* root)
{ {
assert(self != NULL); 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 // traversal breadth
@ -1642,6 +1693,8 @@ bool tree_avl_init(struct _tree *self, uint32_t obj_size)
// self->_capacity = 64; // self->_capacity = 64;
// self->_ratio = 2; // self->_ratio = 2;
self->_right_priority = false;
self->insert = tree_avl_insert; self->insert = tree_avl_insert;
self->delete = tree_avl_delete; self->delete = tree_avl_delete;
self->clear = tree_clear; 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->inorder = tree_avl_inorder;
self->postorder = tree_avl_postorder; self->postorder = tree_avl_postorder;
self->breadth = tree_avl_breadth; self->breadth = tree_avl_breadth;
self->order = tree_order;
self->_root = NULL; self->_root = NULL;

View File

@ -299,6 +299,21 @@ void test_tree_num(void)
tree->postorder(tree, tree->_root); tree->postorder(tree, tree->_root);
printf("\n"); 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); tree_free(tree);
} }