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

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 _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);

View File

@ -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;

View File

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