二叉树的层次遍历,从上到下和从下到上分层打印
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;
}
#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;
}
相关文章推荐
- 二叉树层次遍历打印
- 从上往下打印二叉树,层次遍历
- 二叉树 的先序 中序、后序遍历、层次遍历以及树状打印等操作
- android复习路之二叉树层次遍历并且分层
- 按层打印二叉树的节点【层次遍历变形】
- 每日一练(38) - 从上往下打印二叉树(二叉树的层次遍历)
- 剑指offer--从上往下打印二叉树--层次遍历、广度优先搜索
- 二叉树的建立和基础操作<三> —— (三种遍历及分层打印)
- 按照层次遍历并打印二叉树
- 二叉树层次遍历的螺旋打印
- 分层遍历二叉树(按层次从上往下,从左往右)
- 从上往下打印二叉树(分层遍历)
- 二叉树的层次遍历及之形打印算法 Java实现
- 把二叉树打印成多行(二叉树的层次遍历)
- 按层遍历打印二叉树(分层) -- 漫漫算法路 刷题篇
- 19、从上到下打印二叉树(层次遍历)
- 剑指Offer--023-从上往下打印二叉树(层次遍历二叉树)
- 【剑指offer】题60:分层遍历打印二叉树
- 剑指Offer:树的层次遍历,分层打印和按之字型打印
- 二叉树的构建、层次打印、广度遍历、深度遍历、K值路径