二叉树的遍历

本文详细介绍了二叉树的先序、中序、后序遍历算法,包括递归和非递归实现方式,以及层次遍历算法。通过具体代码示例,深入解析了每种遍历方法的实现原理和步骤。

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

先序遍历(递归)

算法

二叉树为空,则空操作
二叉树非空,访问根节点(D),访问左子树(L),访问右子树(R)

代码

	void PreOrderTraverse(BiTree T)	//传递的参数为一棵树 
	{
		if(T==NULL)
			return ;	//为空直接返回	
		else
		{
			visit(T);	//访问根结点,可以写visit函数进行访问操作 
			PreOrderTraverse(T->Lchild);	//递归遍历左子树 
			PreOrderTraverse(T->Rchild);	//递归遍历右子树 
		}
 	}

中序遍历(递归)

算法

二叉树为空,则空操作
二叉树非空,访问左子树(L),访问根节点(D),访问右子树(R)

代码

	void InOrderTraverse(BiTree T)	//传递的参数为一棵树 
	{
		if(T==NULL)
			return ;	//为空直接返回	
		else
		{
			InOrderTraverse(T->Lchild);	//递归遍历左子树 
			visit(T);	//访问根结点,可以写visit函数进行访问操作 
			InOrderTraverse(T->Rchild);	//递归遍历右子树 
		}
 	}

后序遍历(递归)

算法

二叉树为空,则空操作
二叉树非空,访问左子树(L),访问右子树(R),访问根节点(D)

代码

	void PostOrderTraverse(BiTree T)	//传递的参数为一棵树 
	{
		if(T==NULL)
			return ;	//为空直接返回	
		else
		{
			PostOrderTraverse(T->Lchild);	//递归遍历左子树 
			PostOrderTraverse(T->Rchild);	//递归遍历右子树
			visit(T);	//访问根结点,可以写visit函数进行访问操作 
		}
 	}

中序遍历非递归算法

代码

		void InOrderTraverse(BiTree T)
 	{
 		BiTree p,q;
		stack<BiTree> S;
		p=T;
		while(p||!S.empty())	//为空且p==NULL时结束循环 
		{
			if(p)				//p不为空(子树存在) 
			{
				S.push(p);		//将根节点压入栈顶 
				p=p->Lchild;	//判断下面是否还有左子树(左子树的根节点是否为空) 
			}
			else				//为空(子树不存在,访问根节点,在右子树上执行操作) 
			{
				q=S.pop();		//取栈顶元素,即根结点 
				visit(q);		//访问根节点 
				p=q->Rchild;	//在右子树上执行操作,因为左子树已经访问过了
			}
		} 	
 	}

二叉树的层次遍历

算法

将根节点入队
队不为空时循环,从队列中出队一个结点,访问
此节点有左孩子,左孩子入队
此节点有右孩子,右孩子入队

代码

	 void LevelOrder(BiTree T)
	 {
	 	queue<BiTree> Q;
 		Q.enqueue(T);	//将根节点入队 
 		while(!Q.empty())	//队列为空时结束循环 
 		{
 			BiTree q=Q.dequeue();	//队首元素出队 
 			visit(q);				//访问此节点 
 			if(!q->Lchild)			//此节点有左孩子,左孩子入队 
 				Q.enqueue(q->Lchild);
 			if(!q->Rchild)			//此节点有右孩子,右孩子入队 
 				Q.enqueue(q->Rchild);
	 	}
  	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值