利用栈实现的二叉树的先、中、后序遍历

本文介绍如何使用栈来实现二叉树的先序、中序和后序遍历。通过栈的操作,如压栈、弹栈等,实现对二叉树节点的有效访问。在每种遍历方式中,通过特定的逻辑处理来确保正确的访问顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用栈实现二叉树的遍历

栈的操作参考:

先序遍历

status PreOrderbyStack(BiTree *T, void (*visit)(BiTree *T))
{
	stack s;
	BiTree *pmove;
	initStack(&s);

	pmove = T;
	Push(&s, T);
	while(!IsStackEmpty(&s))
	{
		Pop(&s, &pmove);
		if(pmove == NULL)
		{
			continue;
		}
		else
		{
			visit(pmove);
			Push(&s, pmove->rchild);
			Push(&s, pmove->lchild);
		}
	}
	destroyStack(&s);
	return TRUE;
}

中序遍历

status InOrderbyStack(BiTree *T, void (*visit)(BiTree *T))
{
	stack s;
	BiTree *pmove;
	BiTree *flag;
	initStack(&s);

	pmove = T;
	Push(&s, T);
	Push(&s, (BiTree *)1);//加入标号,表示这个节点左孩子还未访问
	while(!IsStackEmpty(&s))
	{
		Pop(&s, &flag);
		Pop(&s, &pmove);
		if((int)flag == 1)
		{
			while(pmove->lchild != NULL)
			{
				Push(&s, pmove);
				Push(&s, (BiTree *)0);//加入标号,表示这个节点左孩子已被访问
				pmove = pmove->lchild;
			}
		}
		visit(pmove);
		if(pmove->rchild != NULL)
		{
			Push(&s, pmove->rchild);
			Push(&s, (BiTree *)1);//加入标号,表示这个节点左孩子还未访问
		}
	}

	destroyStack(&s);
	return TRUE;
}

后序遍历

status PostOrderbyStack(BiTree *T, void (*visit)(BiTree *T))
{
	stack s;
	BiTree *pmove;
	BiTree *flag;
	initStack(&s);

	pmove = T;
	Push(&s, T);
	Push(&s, (BiTree *)0);//加入标号,表示这个节点左孩子还未访问
	while(!IsStackEmpty(&s))
	{
		Pop(&s, &flag);
		Pop(&s, &pmove);
		if((int)flag == 0)
		{
			while(pmove->lchild != NULL)
			{
				Push(&s, pmove);
				Push(&s, (BiTree *)1);//加入标号,表示这个节点左孩子已被访问
				pmove = pmove->lchild;
			}
		}
		if((int)flag < 2)
		{
			if(pmove->rchild != NULL)
			{
				Push(&s, pmove);
				Push(&s, (BiTree *)2);//加入标号,表示这个节点右孩子已被访问
				pmove = pmove->rchild;

				Push(&s, pmove);
				Push(&s, (BiTree *)0);//加入标号,表示这个节点左孩子还未访问
				continue;
			}
		}
		visit(pmove);
	}

	destroyStack(&s);
	return TRUE;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值