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

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; return;
} }
struct _tree_node* node = NULL; struct _tree_node* node = root;
stack_t stack = stack_new(); stack_t stack = stack_new();
stack_init(stack, sizeof(struct _tree_node*)); 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(!self->_right_priority) // left priority
{
while(!stack->empty(stack) || node != NULL)
{ {
if(node->right != NULL) if(node != NULL)
{ {
stack->push(stack, &node->right); 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 }
else
{
while(!stack->empty(stack) || node != NULL)
{ {
if(node->left != NULL) if(node != NULL)
{ {
stack->push(stack, &node->left); 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_t stack = stack_new();
stack_init(stack, sizeof(struct _tree_node*)); stack_init(stack, sizeof(struct _tree_node*));
if(!self->_right_priority) if(!self->_right_priority) // left priority
{ {
while(!stack->empty(stack) || node != NULL) while(!stack->empty(stack) || node != NULL)
{ {
while(node != NULL) if(node != NULL)
{ {
stack->push(stack, &node); stack->push(stack, &node);
node = node->left; node = node->left;
} }
else
// 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))
{ {
stack->pop(stack, &node); stack->pop(stack, &node);
self->print_obj(node->obj); self->print_obj(node->obj);
node = node->right; 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 || !stack->empty(stack))
{ {
while(node != NULL) if(node != NULL)
{ {
stack->push(stack, &node); stack->push(stack, &node);
node = node->right; node = node->right;
} }
else
// 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))
{ {
stack->pop(stack, &node); stack->pop(stack, &node);
self->print_obj(node->obj); self->print_obj(node->obj);
@ -2198,42 +2189,48 @@ void tree_avl_postorder(struct _tree* self, struct _tree_node* root)
{ {
return; return;
} }
struct _tree_node* node = NULL; struct _tree_node* node = root;
stack_t stack2 = stack_new(); stack_t stack2 = stack_new();
stack_init(stack2, sizeof(struct _tree_node*)); stack_init(stack2, sizeof(struct _tree_node*));
// left: postorder == right: the reverse of preorder // because: left:postorder == right:the reverse of preorder
// so we use stack2 to store the right node
stack_t stack = stack_new(); stack_t stack = stack_new();
stack_init(stack, sizeof(struct _tree_node*)); 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(!self->_right_priority) // left priority
{
while(!stack->empty(stack) || node != NULL)
{ {
if(node->left != NULL) if(node != NULL)
{ {
stack->push(stack, &node->left); 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 }
else
{
while(!stack->empty(stack) || node != NULL)
{ {
if(node->right != NULL) if(node != NULL)
{ {
stack->push(stack, &node->right); 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;
} }
} }
} }