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 _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);
|
||||||
|
84
src/tree.c
84
src/tree.c
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user