另一种使用栈实现二叉树层次遍历的方法
使用三个栈实现二叉树的层次遍历
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>