mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-07-03 07:46:53 +08:00
后序遍历也使用栈实现了
This commit is contained in:
parent
4fa3a06e8a
commit
1f6dea6a67
62
src/tree.c
62
src/tree.c
@ -1521,7 +1521,7 @@ static struct _tree_node* tree_trun_right_then_left(struct _tree* self, struct _
|
|||||||
|
|
||||||
int32_t tree_height(struct _tree* self, struct _tree_node* root)
|
int32_t tree_height(struct _tree* self, struct _tree_node* root)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 1
|
||||||
assert(self != NULL);
|
assert(self != NULL);
|
||||||
if(root == NULL)
|
if(root == NULL)
|
||||||
{
|
{
|
||||||
@ -2029,9 +2029,10 @@ void tree_avl_preorder(struct _tree* self, struct _tree_node* root)
|
|||||||
while(!stack->empty(stack))
|
while(!stack->empty(stack))
|
||||||
{
|
{
|
||||||
stack->pop(stack, &node);
|
stack->pop(stack, &node);
|
||||||
|
self->print_obj(node->obj);
|
||||||
|
|
||||||
if(!self->_right_priority) // left priority
|
if(!self->_right_priority) // left priority
|
||||||
{
|
{
|
||||||
self->print_obj(node->obj);
|
|
||||||
if(node->right != NULL)
|
if(node->right != NULL)
|
||||||
{
|
{
|
||||||
stack->push(stack, &node->right);
|
stack->push(stack, &node->right);
|
||||||
@ -2043,7 +2044,6 @@ void tree_avl_preorder(struct _tree* self, struct _tree_node* root)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
self->print_obj(node->obj);
|
|
||||||
if(node->left != NULL)
|
if(node->left != NULL)
|
||||||
{
|
{
|
||||||
stack->push(stack, &node->left);
|
stack->push(stack, &node->left);
|
||||||
@ -2161,6 +2161,7 @@ void tree_avl_inorder(struct _tree* self, struct _tree_node* root)
|
|||||||
|
|
||||||
void tree_avl_postorder(struct _tree* self, struct _tree_node* root)
|
void tree_avl_postorder(struct _tree* self, struct _tree_node* root)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
assert(self != NULL);
|
assert(self != NULL);
|
||||||
if(root == NULL)
|
if(root == NULL)
|
||||||
{
|
{
|
||||||
@ -2191,6 +2192,61 @@ void tree_avl_postorder(struct _tree* self, struct _tree_node* root)
|
|||||||
}
|
}
|
||||||
self->print_obj(root->obj);
|
self->print_obj(root->obj);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
assert(self != NULL);
|
||||||
|
if(root == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
struct _tree_node* node = NULL;
|
||||||
|
|
||||||
|
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
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
stack->push(stack, &node->left);
|
||||||
|
}
|
||||||
|
if(node->right != NULL)
|
||||||
|
{
|
||||||
|
stack->push(stack, &node->right);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(node->right != NULL)
|
||||||
|
{
|
||||||
|
stack->push(stack, &node->right);
|
||||||
|
}
|
||||||
|
if(node->left != NULL)
|
||||||
|
{
|
||||||
|
stack->push(stack, &node->left);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while(!stack2->empty(stack2))
|
||||||
|
{
|
||||||
|
stack2->pop(stack2, &node);
|
||||||
|
self->print_obj(node->obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
stack_free(stack);
|
||||||
|
stack_free(stack2);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// traversal breadth
|
// traversal breadth
|
||||||
|
Loading…
Reference in New Issue
Block a user