二叉树的层次遍历,从上到下和从下到上分层打印

用queue和vector都可以实现层次遍历,但用vector更容易标记每层元素的位置,便于分层标记和打印,以及统计每层元素的个数,具体代码实现如下,代码均在VC6.0下测试过。

二叉树的层次遍历,从上到下和从下到上分层打印_第1张图片

#include 
#include 
#include 
#include 
using namespace std;
typedef struct BinNode{  
    char data;  
    struct BinNode *lchild,*rchild;  
  
}BinNode,*BinTree;  
//按先序创建树 ABD##E##CF####  
void creatTree(BinTree &T)  
{     
  
    char c;  
    cin>>c;  
    if(c=='#')  
  
        T=NULL;  
    else{  
        T=(BinTree)malloc(sizeof(BinNode));  
        T->data=c;  
        creatTree(T->lchild);  
        creatTree(T->rchild);  
        }  
}  
void visit(BinTree T)  
{  
    if(T->data!='#')  
        cout<data<<" ";  
} 
void LevelVisit(BinTree T)                  //层次遍历
{
	BinTree p,cur;
	p=T;
	queue que;
	que.push(p);
	while(!que.empty())
	{
		cur=que.front();
		visit(cur);
		que.pop();
		if(cur->lchild)
			que.push(cur->lchild);
		if(cur->rchild)
			que.push(cur->rchild);
	}
}
void PrintNodeByLevel(BinTree T)              //分层打印
{
	if(!T)
		return;
	vector vect;
	vect.push_back(T);
	int cur=0;
	int last=1;
	while(curlchild)
		{
			vect.push_back(vect[cur]->lchild);
		}
		if(vect[cur]->rchild)
		{
			vect.push_back(vect[cur]->rchild);
		}
		cur++;                          //一层遍历完后,记录下层的起始位置
		}
		cout< vect;
	vect.push_back(T);
	
	int cur=0;
	int last=1;
	while(currchild)    //从左到右自顶向下,颠倒两句就是从右到左了
		{
			vect.push_back(vect[cur]->rchild);
		}
			if(vect[cur]->lchild)
		{
			vect.push_back(vect[cur]->lchild);
		}
		cur++;                          //一层遍历完后,记录下层的起始位置
		}
		cur++;
	}
//	vector::iterator iter;
	for(int i=vect.size()-2;i>=0;i--)  //容器中最后一个元素为空
	{
		if(vect[i]==NULL)
			cout<


你可能感兴趣的:(Data,structure)