二叉树遍历 小讲

本文深入探讨了二叉树的遍历方式,包括先序、中序和后序遍历,并详细阐述了递归和非递归实现方法。以HDU 1710为例,讲解如何根据先序和中序遍历来求解后序遍历。

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

    才发现,慢慢地长大,烦恼也慢慢地来了。时间,带给我们的,是成熟 and 沧桑、、

    今天来讲一讲二叉树的遍历,主要通过递归和非递归的方式来实现、、

    遍历方式:

    先序:根 - 左 - 右

    中序:左 - 根 - 右

    后序:左 - 右 - 根

    递归实现

   

// 先序遍历
void PreOrder(BTNode * b)
{
	if(b != NULL)
	{
		printf("%c\n", b -> data);
		PreOrder(b -> lchild);
		PreOrder(b -> rchild);
	}
}

// 中序遍历
void InOrder(BTNode * b)
{
	if(b != NULL)
	{
		InOrder(b -> lchild);
		printf("%c\n", b -> data);
		InOrder(b -> rchild);
	}
}

// 后续遍历
void PostOrder(BTNode * b)
{
	if(b != NULL)
	{
		PostOrder(b -> lchild);
		PostOrder(b -> rchild);
		printf("%c\n", b -> data);
	}
}


    非递归实现:

    后序好像是最麻烦的诶, 我还是下次再补上吧、、、 (下面的代码参考了  cnblog  海子的 博客)

   

//  先序遍历
void PreOrder(BTNode *b)
{
	stack<BTNode*> sta;
	BTNode *p = b;
	while(p != NULL || !sta.empty())
	{
		while(p != NULL)
		{
			printf("%c\n", p -> data);
			sta.push(p);
			p = p -> lchild;
		}

		if(! sta.empty())
		{
			p = sta.top();
			sta.pop();
			p = p -> rchild;
		}
	}
	
}

// 中序遍历
void InOrder(BTNode *b)
{
	stack<BTNode*> sta;
	BTNode *p = b;
	while(p != NULL || sta.empty())
	{
		while(p != NULL)
		{
			sta.push(p);
			p = p -> lchild;
		}
		if(!sta.empty())
		{
			p = sta.top();
			printf("%c", p -> data);
			sta.pop();
			p = p -> rchild;		
		}
	}
}


     例题:

    HDU  1710   链接: http://acm.hdu.edu.cn/showproblem.php?pid=1710

     题意是,给你一棵二叉树的 先序遍历的排列和中序遍历排列,然后你求出后序遍历的排列。

    

   

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值