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

本文详细介绍了二叉树的前序、中序、后序及层次遍历算法,包括递归和非递归实现方式。通过具体的代码示例,深入解析了各种遍历方法的实现原理和步骤。
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);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值