另一种使用栈实现二叉树层次遍历的方法

本文介绍了如何使用三个栈来实现二叉树的层次遍历,通过参考相关文章,进一步优化了代码,实现了只用两个栈的层序遍历方法,简化了操作流程。
摘要由CSDN通过智能技术生成

另一种使用栈实现二叉树层次遍历的方法

使用三个栈实现二叉树的层次遍历

int  LayerOrderByStackTraverse(BiTree T,int (*Visit)(TreeElemType d))
{
    
	//s1存储每层的所有树节点,次序是逆序(左边的节点在栈下方)
	//s2是存储当前层节点的下层所有节点,次序也是逆的
	//s3是为了正确顺序输出节点,从s1反序而来的,左边的节点在栈上方)
	//temp是s2和s1的中转变量,为了下次循环能够处理下一层节点。
	LinkStack s1,s2,s3,temp;
	initStack(&s1);
	initStack(&s2);
	initStack(&s3);
	
	BiNode * node;
	
	if(T==NULL)
		return ERROR;
	pushStack(s1,T);
	
	while(lenStack(s1)){
   
		
		while(lenStack(s1)){
     //从s1反序生成s3,左边的节点在栈上方)
			popStack(s1,&node);
			pushStack(s3,node);
		}
		while(lenStack(s3)){
     //从s3出栈并输出节点,是层序的正确顺序
			popStack(s3,&node);
			printTreeNode(node);
			//按层序正确顺序将当前层的下层结点压入s2,s2中左边的节点在栈下方
			if(node->l)
				pushStack(s2,node->l);		
			if(node->r)
				pushStack(s2,node->r);

		} //循环结束后,s2中保存了下一层节点信息
		
		//以下交换s2和s1所指向的栈,以便下次循环通过s1来处理下一层节点
		temp=s1;
		s1=s2;
		s2=temp;		
	}

	return OK;
}

以上代码写好后,发现了以下文章:
双栈法对二叉树进行层序遍历
https://blog.csdn.net/qq_46477898/article/details/110142364

从而精简掉s3栈,且省略了交换两个栈的过程。
精简后的代码:

int  LayerOrderByStackTraverse2(BiTree T,int (*Visit)(TreeElemType d))
{
    
	//s1存储每层的所有树节点,次序是逆序(左边的节点在栈下方)
	//s2是为了正确顺序输出节点,从s1反序而来的,左边的节点在栈上方)
	LinkStack s1,s2;
	initStack(&s1);
	initStack(&s2);
	
	BiNode * node;
	
	if(T==NULL)
		return ERROR;
	pushStack(s1,T);
	
	while(lenStack(s1)){
   
		
		while(lenStack(s1)){
     //从s1反序生成s2,左边的节点在栈上方)
			popStack(s1,&node);
			pushStack(s2,node);
		}
		while(lenStack(s2)){
     //从s2出栈并输出节点,是层序的正确顺序
			popStack(s2,&node);
			printTreeNode(node);
			//按层序正确顺序将当前层的下层结点压入s1,s1中左边的节点在栈下方
			if(node->l)
				pushStack(s1,node->l);		
			if(node->r)
				pushStack(s1,node->r);
			
		} //循环结束后,s1中保存了下一层节点信息		
	}
	
	return OK;
}

完整的代码如下:


#include <stdio.h>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值