经过分析,发现还是原来的代码,对前序、中序、后序三种遍历方式写的简介。于是就参考并优化了当前代码。

This commit is contained in:
建峰 2024-06-25 10:50:21 +08:00
parent 1f6dea6a67
commit 229e3f1140

View File

@ -2021,36 +2021,44 @@ void tree_avl_preorder(struct _tree* self, struct _tree_node* root)
{
return;
}
struct _tree_node* node = NULL;
struct _tree_node* node = root;
stack_t stack = stack_new();
stack_init(stack, sizeof(struct _tree_node*));
stack->push(stack, &root);
while(!stack->empty(stack))
{
stack->pop(stack, &node);
self->print_obj(node->obj);
if(!self->_right_priority) // left priority
{
if(node->right != NULL)
while(!stack->empty(stack) || node != NULL)
{
stack->push(stack, &node->right);
if(node != NULL)
{
self->print_obj(node->obj);
stack->push(stack, &node);
node = node->left;
}
if(node->left != NULL)
else
{
stack->push(stack, &node->left);
stack->pop(stack, &node);
node = node->right;
}
}
}
else
{
if(node->left != NULL)
while(!stack->empty(stack) || node != NULL)
{
stack->push(stack, &node->left);
if(node != NULL)
{
self->print_obj(node->obj);
stack->push(stack, &node);
node = node->right;
}
if(node->right != NULL)
else
{
stack->push(stack, &node->right);
stack->pop(stack, &node);
node = node->left;
}
}
}
@ -2103,28 +2111,20 @@ void tree_avl_inorder(struct _tree* self, struct _tree_node* root)
stack_t stack = stack_new();
stack_init(stack, sizeof(struct _tree_node*));
if(!self->_right_priority)
if(!self->_right_priority) // left priority
{
while(!stack->empty(stack) || node != NULL)
{
while(node != NULL)
if(node != NULL)
{
stack->push(stack, &node);
node = node->left;
}
// do
// {
// stack->pop(stack, &node);
// self->print_obj(node->obj);
// }while(node->right == NULL && !stack->empty(stack));
// node = node->right;
// optimize code
if(!stack->empty(stack))
else
{
stack->pop(stack, &node);
self->print_obj(node->obj);
node = node->right;
}
}
@ -2133,21 +2133,12 @@ void tree_avl_inorder(struct _tree* self, struct _tree_node* root)
{
while(node != NULL || !stack->empty(stack))
{
while(node != NULL)
if(node != NULL)
{
stack->push(stack, &node);
node = node->right;
}
// do
// {
// stack->pop(stack, &node);
// self->print_obj(node->obj);
// }while(node->left == NULL && !stack->empty(stack));
// node = node->left;
// optimize code
if(!stack->empty(stack))
else
{
stack->pop(stack, &node);
self->print_obj(node->obj);
@ -2198,42 +2189,48 @@ void tree_avl_postorder(struct _tree* self, struct _tree_node* root)
{
return;
}
struct _tree_node* node = NULL;
struct _tree_node* node = root;
stack_t stack2 = stack_new();
stack_init(stack2, sizeof(struct _tree_node*));
// left: postorder == right: the reverse of preorder
// so we use stack2 to store the right node
// because: left:postorder == right:the reverse of preorder
stack_t stack = stack_new();
stack_init(stack, sizeof(struct _tree_node*));
stack->push(stack, &root);
while(!stack->empty(stack))
{
stack->pop(stack, &node);
// self->print_obj(node->obj);
stack2->push(stack2, &node);
if(!self->_right_priority) // left priority
{
if(node->left != NULL)
while(!stack->empty(stack) || node != NULL)
{
stack->push(stack, &node->left);
if(node != NULL)
{
stack2->push(stack2, &node);
stack->push(stack, &node);
node = node->right;
}
if(node->right != NULL)
else
{
stack->push(stack, &node->right);
stack->pop(stack, &node);
node = node->left;
}
}
}
else
{
if(node->right != NULL)
while(!stack->empty(stack) || node != NULL)
{
stack->push(stack, &node->right);
if(node != NULL)
{
stack2->push(stack2, &node);
stack->push(stack, &node);
node = node->left;
}
if(node->left != NULL)
else
{
stack->push(stack, &node->left);
stack->pop(stack, &node);
node = node->right;
}
}
}