您的位置:首页 > 其它

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

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



#include <iostream>
#include <stdio.h>
#include <queue>
#include <vector>
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<<T->data<<" ";
}
void LevelVisit(BinTree T) //层次遍历
{
BinTree p,cur;
p=T;
queue<BinTree> 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<BinTree> vect;
vect.push_back(T);
int cur=0;
int last=1;
while(cur<vect.size())
{
last=vect.size();
cout<<"每层的元素个数: "<<last-cur<<endl; //统计每层的元素个数
while(cur<last)
{
visit(vect[cur]);
if(vect[cur]->lchild)
{
vect.push_back(vect[cur]->lchild);
}
if(vect[cur]->rchild)
{
vect.push_back(vect[cur]->rchild);
}
cur++; //一层遍历完后,记录下层的起始位置
}
cout<<endl; //没有这个分层标记,就是层次遍历

}

}
void FromBottomToTop(BinTree T) //从下到上分层打印
{
if(!T)
return;
vector<BinTree> vect;
vect.push_back(T);

int cur=0;
int last=1;
while(cur<vect.size())
{
vect.push_back(NULL);
last=vect.size();
// cout<<"每层的元素个数: "<<last-cur<<endl; //统计每层的元素个数
while(cur<last-1)
{
// visit(vect[cur]);

if(vect[cur]->rchild) //从左到右自顶向下,颠倒两句就是从右到左了
{
vect.push_back(vect[cur]->rchild);
}
if(vect[cur]->lchild)
{
vect.push_back(vect[cur]->lchild);
}
cur++; //一层遍历完后,记录下层的起始位置
}
cur++;
}
// vector<BinTree>::iterator iter;
for(int i=vect.size()-2;i>=0;i--) //容器中最后一个元素为空
{
if(vect[i]==NULL)
cout<<endl;
else
visit(vect[i]);
}

}

int main()
{
BinTree T;
creatTree(T);
LevelVisit(T);
cout<<endl;
PrintNodeByLevel(T);
cout<<endl;
FromBottomToTop(T);
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: