按照层次序实现二叉树遍历。
对于上图中的二叉树,层次遍历的实现结果如下
层次遍历的过程天然地符合队列这个数据结构,因此可以用队列方法来非递归地实现层次遍历。目前还不太清楚如何递归地实现层次遍历,网上看到的一些解法,声称采用了递归方法进行层次遍历,但是它们是在while循环中进行的递归,是一种伪递归。由此有可以猜测,可能这种遍历表现出来的数据访问方式确实不匹配递归的算法。下面仅仅给出层次遍历的非递归解法。
void level_order_2(link t, void (*visit)(link))
{
if(!t)
return;
std::queue<struct node> que;
que.push(*t);
while(!que.empty()){
struct node node_p;
node_p = que.front();
que.pop();
visit(&node_p);
if(node_p.l!=NULL)
que.push(*node_p.l);
if(node_p.r!=NULL)
que.push(*node_p.r);
}
return;
}
下面是完整的文件,主要实现了二叉树的前序,中序,后序,层序的遍历。有bintree.h,bintree.cpp,main.cpp
以下为bintree.h
#ifndef BINTREE_H
#define BINTREE_H
typedef struct node* link;
struct node{
int item;
link l,r;
};
struct tag_node{
link node_link;
bool is_first;
};
link init(int VLR[],int LVR[],int n);
void pre_order(link t, void (*visit)(link));//递归前续遍历
void pre_order_2(link t, void (*visit)(link));//非递归前续遍历
void in_order(link t, void (*visit)(link));//递归中续遍历
void in_order_2(link t, void (*visit)(link));//非递归中续遍历
void post_order(link t, void (*visit)(link));//递归后续遍历
void post_order_2(link t, void (*visit)(link));//非递归后续遍历第一种
void post_order_3(link t, void (*visit)(link)); //非递归后续遍历第二种
void level_order(link t, int level, void (*visit)(link));//层序遍历递归,
void level_order_2(link t, void (*visit)(link));//层序遍历非递归
int count(l