1.二叉树
1.1 不用递归实现中序遍历
void UnRecInorderTraversal
{
if(p_tree == NULL)return;
Stack* p_stack = NULL;
s_Init(p_stack);
while(1)
{
while(p_tree)
{
s_Push(p_stack, p_tree);
p_tree = p_tree->p_left;
}
p_tree = s_Pop(p_stack);
if(p_tree == NULL)return;
printf("%d ", p_tree->n_value);
p_tree = p_tree->p_right;
}
}
1.2 不使用递归进行后序遍历
- 1.大致的思路就是:保存、向左走、判断栈顶是否为空、判断栈顶元素是否有右、有右的话是否被打印过、没被打印则返回保存从头开始;
void UnRecLastorderTraversal(BinaryTree* p_tree)
{
BinaryTree* p_flag = NULL;
Stack* p_stack = NULL;
s_Init(&p_stack);
while(1)
{
while(p_tree)
{
s_Push(p_stack, p_tree);
p_tree = p_tree->p_left;
}
if(p_stack->p_top->n_value == NULL)break;
if(p_stack->p_top->n_value->p_right == NULL || p_stack->p_top->n_value->p_right == p_flag)
{
p_flag = s_Pop(p_stack);
printf("%d ", p_flag->n_value);
}
else
{
p_tree = p_stack->p_top->n_value->p_right;
}
}
}
1.3 层序遍历(需要用到队列和循环)
typedef struct node
{
int n_value;
struct node* p_next;
}Node;
typedef struct queue
{
int n_count;
Node* p_tail;
Node* p_head;
}Queue;
void q_Init(Queue** pp_queue)
{
*pp_queue = (Queue*)malloc(sizeof(Queue));
(*pp_queue)->n_count = 0;
(*pp_queue)->p_head = NULL;
(*pp_queue)->p_tail = NULL;
}
void q_Push(Queue* p_queue, BinaryTree* num)
{
Node* p_temp = NULL;
if(p_queue == NULL)return;
p_temp = (Node*)malloc(sizeof(Node));
p_temp->n_value = num;
p_temp->p_next = NULL;
if(p_queue->p_head != NULL)
p_queue->p_tail->p_next = p_temp;
else
p_queue->p_head = p_temp;
p_queue->p_tail = p_temp;
p_queue->n_count++;
}
BinaryTree* q_Pop(Queue* p_queue)
{
BinaryTree* re_num;
Node* p_del = NULL;
if(p_queue == NULL)return NULL;
p_del = p_queue->p_head;
re_num = p_del->n_value;
p_queue->p_head = p_queue->p_head->p_next;
free(p_del);
p_del = NULL;
p_queue->n_count--;
if(p_queue->n_count == 0)p_queue->p_tail = NULL;
return re_num;
}
void SequenceTraversal(BinaryTree* p_tree)
{
if(p_tree == NULL)return;
Queue* p_queue = NULL;
q_Init(&p_queue);
q_Push(p_queue, p_tree);
while(p_queue->n_count)
{
p_tree = q_Pop(p_queue);
printf("%d ", p_tree->n_value);
if(p_tree->p_left != NULL)
q_Push(p_queue, p_tree->p_left);
if(p_tree->p_right != NULL)
q_Push(p_queue, p_tree->p_right);
}
}
1.4 如何把一颗二叉树按层打印(我想打印第几层就打印第几层)
- 1.可以使用两个队列来存储;
- 2.也可以用两个变量来记录;
- 3.还可以使用一个特殊标识符来记录;