前序遍历用栈实现

This commit is contained in:
建峰 2024-06-24 17:52:08 +08:00
parent 00ae16c777
commit 05bfb65d8e
2 changed files with 105 additions and 0 deletions

View File

@ -0,0 +1,62 @@
# tree
日志
```
----- unicstl test -----
----- test_tree_num -----
----- insert -----
insert = ( 5 ) size = 1 : ( 5 )
insert = ( 2 ) size = 2 : ( 5 ) ( 2 )
insert = ( 3 ) size = 3 : ( 3 ) ( 2 ) ( 5 )
insert = ( 1 ) size = 4 : ( 3 ) ( 2 ) ( 1 ) ( 5 )
insert = ( 7 ) size = 5 : ( 3 ) ( 2 ) ( 1 ) ( 5 ) ( 7 )
insert = ( 8 ) size = 6 : ( 3 ) ( 2 ) ( 1 ) ( 7 ) ( 5 ) ( 8 )
insert = ( 6 ) size = 7 : ( 3 ) ( 2 ) ( 1 ) ( 7 ) ( 5 ) ( 6 ) ( 8 )
insert = ( 4 ) size = 8 : ( 3 ) ( 2 ) ( 1 ) ( 7 ) ( 5 ) ( 4 ) ( 6 ) ( 8 )
insert = ( 9 ) size = 9 : ( 3 ) ( 2 ) ( 1 ) ( 7 ) ( 5 ) ( 4 ) ( 6 ) ( 8 ) ( 9 )
insert = (10 ) size = 10 : ( 3 ) ( 2 ) ( 1 ) ( 7 ) ( 5 ) ( 4 ) ( 6 ) ( 9 ) ( 8 ) (10 )
insert = (12 ) size = 11 : ( 7 ) ( 3 ) ( 2 ) ( 1 ) ( 5 ) ( 4 ) ( 6 ) ( 9 ) ( 8 ) (10 ) (12 )
insert = (11 ) size = 12 : ( 7 ) ( 3 ) ( 2 ) ( 1 ) ( 5 ) ( 4 ) ( 6 ) ( 9 ) ( 8 ) (11 ) (10 ) (12 )
insert = (15 ) size = 13 : ( 7 ) ( 3 ) ( 2 ) ( 1 ) ( 5 ) ( 4 ) ( 6 ) (11 ) ( 9 ) ( 8 ) (10 ) (12 ) (15 )
insert = (14 ) size = 14 : ( 7 ) ( 3 ) ( 2 ) ( 1 ) ( 5 ) ( 4 ) ( 6 ) (11 ) ( 9 ) ( 8 ) (10 ) (14 ) (12 ) (15 )
insert = (13 ) size = 15 : ( 7 ) ( 3 ) ( 2 ) ( 1 ) ( 5 ) ( 4 ) ( 6 ) (11 ) ( 9 ) ( 8 ) (10 ) (14 ) (12 ) (13 ) (15 )
----- preorder -----
( 7 ) ( 3 ) ( 2 ) ( 1 ) ( 5 ) ( 4 ) ( 6 ) (11 ) ( 9 ) ( 8 ) (10 ) (14 ) (12 ) (13 ) (15 )
----- inorder -----
( 1 ) ( 2 ) ( 3 ) ( 4 ) ( 5 ) ( 6 ) ( 7 ) ( 8 ) ( 9 ) (10 ) (11 ) (12 ) (13 ) (14 ) (15 )
----- postorder -----
( 1 ) ( 2 ) ( 4 ) ( 6 ) ( 5 ) ( 3 ) ( 8 ) (10 ) ( 9 ) (13 ) (12 ) (15 ) (14 ) (11 ) ( 7 )
----- breadth -----
( 7 ) ( 3 ) (11 ) ( 2 ) ( 5 ) ( 9 ) (14 ) ( 1 ) ( 4 ) ( 6 ) ( 8 ) (10 ) (12 ) (15 ) (13 )
----- right priority -----
----- preorder(right) -----
( 7 ) (11 ) (14 ) (15 ) (12 ) (13 ) ( 9 ) (10 ) ( 8 ) ( 3 ) ( 5 ) ( 6 ) ( 4 ) ( 2 ) ( 1 )
----- inorder(right) -----
(15 ) (14 ) (13 ) (12 ) (11 ) (10 ) ( 9 ) ( 8 ) ( 7 ) ( 6 ) ( 5 ) ( 4 ) ( 3 ) ( 2 ) ( 1 )
----- postorder(right) -----
(15 ) (13 ) (12 ) (14 ) (10 ) ( 8 ) ( 9 ) (11 ) ( 6 ) ( 4 ) ( 5 ) ( 1 ) ( 2 ) ( 3 ) ( 7 )
----- breadth(right) -----
( 7 ) (11 ) ( 3 ) (14 ) ( 9 ) ( 5 ) ( 2 ) (15 ) (12 ) (10 ) ( 8 ) ( 6 ) ( 4 ) ( 1 ) (13 )
----- left priority -----
----- preorder -----
( 7 ) ( 3 ) ( 2 ) ( 1 ) ( 5 ) ( 4 ) ( 6 ) (11 ) ( 9 ) ( 8 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 5 ) size = 14 : ( 7 ) ( 3 ) ( 2 ) ( 1 ) ( 6 ) ( 4 ) (11 ) ( 9 ) ( 8 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 2 ) size = 13 : ( 7 ) ( 3 ) ( 1 ) ( 6 ) ( 4 ) (11 ) ( 9 ) ( 8 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 3 ) size = 12 : ( 7 ) ( 4 ) ( 1 ) ( 6 ) (11 ) ( 9 ) ( 8 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 1 ) size = 11 : (11 ) ( 7 ) ( 4 ) ( 6 ) ( 9 ) ( 8 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 7 ) size = 10 : (11 ) ( 8 ) ( 4 ) ( 6 ) ( 9 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 8 ) size = 9 : (11 ) ( 9 ) ( 4 ) ( 6 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 6 ) size = 8 : (11 ) ( 9 ) ( 4 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 4 ) size = 7 : (11 ) ( 9 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 9 ) size = 6 : (12 ) (11 ) (10 ) (14 ) (13 ) (15 )
delete = (10 ) size = 5 : (12 ) (11 ) (14 ) (13 ) (15 )
delete = (12 ) size = 4 : (13 ) (11 ) (14 ) (15 )
delete = (11 ) size = 3 : (14 ) (13 ) (15 )
delete = (15 ) size = 2 : (14 ) (13 )
delete = (14 ) size = 1 : (13 )
delete = (13 ) size = 0 :
----- empty -----
```

View File

@ -10,6 +10,7 @@
*/
#include "tree.h"
#include "queue.h"
#include "stack.h"
#if RAVLTREE == 1
// function declare
@ -1947,6 +1948,7 @@ void tree_order(struct _tree* self, bool right_priority)
void tree_avl_preorder(struct _tree* self, struct _tree_node* root)
{
#if 0
assert(self != NULL);
if(root == NULL)
{
@ -1977,6 +1979,47 @@ void tree_avl_preorder(struct _tree* self, struct _tree_node* root)
tree_avl_preorder(self, root->left);
}
}
#else
assert(self != NULL);
if(root == NULL)
{
return;
}
struct _tree_node* node = NULL;
stack_t stack = stack_new();
stack_init(stack, sizeof(struct _tree_node*));
stack->push(stack, &root);
while(!stack->empty(stack))
{
stack->pop(stack, &node);
if(!self->_right_priority) // left priority
{
self->print_obj(node->obj);
if(node->right != NULL)
{
stack->push(stack, &node->right);
}
if(node->left != NULL)
{
stack->push(stack, &node->left);
}
}
else
{
self->print_obj(node->obj);
if(node->left != NULL)
{
stack->push(stack, &node->left);
}
if(node->right != NULL)
{
stack->push(stack, &node->right);
}
}
}
stack_free(stack);
#endif
}
void tree_avl_inorder(struct _tree* self, struct _tree_node* root)