非递归实现二叉树的前序、中序和顺序遍历

void pre_order(BTreeNode *root)
{
	if (root == NULL)
		return;
	
	printf ("%4c", root->data);
	pre_order (root->lchild);
	pre_order (root->rchild);
}

// 非递归方式实现前序遍历
void pre1(BTreeNode *root)
{
	if(root == NULL)
		return;
	
	LinkStack *stack =  CreateStack();
	BTreeNode* p = root;
	
	while (p != NULL || !StackEmpty(stack))
	{
		while(p)
		{
			printf ("%4c", p->data);
			Push(stack, p);
			p = p->lchild;
		}
		
		if (!StackEmpty(stack))
		{
			Pop (stack, &p);
			p = p->rchild;
		}
	}
}

void mid_order(BTreeNode *root)
{
	if (root == NULL)
		return;
	
	mid_order (root->lchild);
	printf ("%4c", root->data);
	mid_order (root->rchild);
}

// 非递归方式实现中序遍历
void mid1(BTreeNode *root)
{
	if(root == NULL)
		return;
	
	LinkStack *stack =  CreateStack();
	BTreeNode* p = root;
	
	while (p != NULL || !StackEmpty(stack))
	{
		while(p)
		{
			Push(stack, p);
			p = p->lchild;
		}
		
		if (!StackEmpty(stack))
		{
			Pop (stack, &p);
			printf ("%4c", p->data);
			p = p->rchild;
		}
	}
}

void last_order(BTreeNode *root)
{
	if (root == NULL)
		return;
	
	last_order (root->lchild);
	
	last_order (root->rchild);
	printf ("%4c", root->data);
}

void level_order(BTreeNode *root)
{
	if (root == NULL)
		return;
	
	LinkQueue * queue = CreateQueue();
	EnQueue (queue, root);  // 根节点进队
	
	while (!QueueEmpty(queue))
	{
		// 队头元素出队
		BTreeNode* p = NULL;
		DeQueue(queue, &p);
		printf ("%4c", p->data);
		if (p->lchild != NULL)
			EnQueue(queue, p->lchild);  // 左节点入队
		
		if (p->rchild != NULL)
			EnQueue(queue, p->rchild);  // 右节点入队
	}
	
	free(queue);
}

猜你喜欢

转载自blog.csdn.net/weixin_43664746/article/details/85056679