mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-05-18 03:51:35 +08:00
添加右子树优先遍历的情况
This commit is contained in:
parent
6e953cb553
commit
6500d9dac4
@ -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);
|
||||
|
54
src/tree.c
54
src/tree.c
@ -1585,9 +1585,17 @@ 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);
|
||||
if(!self->_right_priority)
|
||||
{
|
||||
self->print_obj(root->obj);
|
||||
if(root->left != NULL)
|
||||
{
|
||||
@ -1598,10 +1606,25 @@ void tree_avl_preorder(struct _tree* self, struct _tree_node* root)
|
||||
tree_avl_preorder(self, root->right);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
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(!self->_right_priority)
|
||||
{
|
||||
if(root->left != NULL)
|
||||
{
|
||||
tree_avl_inorder(self, root->left);
|
||||
@ -1612,10 +1635,25 @@ void tree_avl_inorder(struct _tree* self, struct _tree_node* root)
|
||||
tree_avl_inorder(self, root->right);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
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(!self->_right_priority)
|
||||
{
|
||||
if(root->left != NULL)
|
||||
{
|
||||
tree_avl_postorder(self, root->left);
|
||||
@ -1626,6 +1664,19 @@ void tree_avl_postorder(struct _tree* self, struct _tree_node* root)
|
||||
}
|
||||
self->print_obj(root->obj);
|
||||
}
|
||||
else
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
// traversal breadth
|
||||
void tree_avl_breadth(struct _tree* self, struct _tree_node* root)
|
||||
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user