android复习路之二叉树层次遍历并且分层
2017-01-07 15:45
375 查看
二叉树的层次遍历,利用队列辅助实习,并且使用last和nlast 实现二叉树的分层,队列用的是stl里面的。核心点是用队列辅助实现层次遍历,也就是广度优先遍历,判断何时分层,当队列中的最后一个节点和队首元素相等的时候代表着一层结束了,也就是代码中的last和nlast相等的时候了,然后再让nlast指向现在的队尾元素直到下一次last和nlast相等也就是说nlast一直记录的是每一层的最后一个数字。直到最后一个元素弹出。
测试样例:1230048000500
输入树的形状:
1
2 5
3 4
8
代码:
#include <cstdlib>
#include <iostream>
#include <queue>
//size查看数目
//empty判空
//front 取队首
//back取队尾
//pop出栈
using namespacestd;
struct Node {
int data ;
structNode* left;
structNode* right;
};
struct Node * Create(){//构建二叉树
int x;
structNode* tree;
tree=(structNode*)malloc(sizeof(structNode));
cin>>x;
if (x==0) {
tree=NULL;
}
else{
tree->data=x;
tree->left=Create();
tree->right=Create();
}
return tree;
}
void print(structNode* tree){//将二叉树放入的一个队列中
queue<structNode*>
q1;//创建一个队列用来存放节点
q1.push(tree);//首先将树的根节点放入
int last=-1;//定义两个数分别指向出栈的数字和队列中的最后一个数字
int nlast=tree->data;
while (!q1.empty()) {
last=q1.front()->data;//last指向队首元素
if (q1.front()->left!=NULL)
{//判读左子树是否为空不为空的话加入到队列中
q1.push(q1.front()->left);
}
if (q1.front()->right!=NULL)
{//判断右子树是否为空如果不为空加入到队列中
q1.push(q1.front()->right);
}
if (nlast==last) {//判断nlast和last是否相同如果相同就是这一层的最后一个输出换行
nlast=q1.back()->data;
cout<<q1.front()->data<<endl;
}
else{//不相同就输出数字和空格
cout<<q1.front()->data;
}
q1.pop();//出栈一个节点
}
}
int main()
{
structNode* tree;
tree=Create();
print(tree);
}
输出结果:
1
25
34
8
测试样例:1230048000500
输入树的形状:
1
2 5
3 4
8
代码:
#include <cstdlib>
#include <iostream>
#include <queue>
//size查看数目
//empty判空
//front 取队首
//back取队尾
//pop出栈
using namespacestd;
struct Node {
int data ;
structNode* left;
structNode* right;
};
struct Node * Create(){//构建二叉树
int x;
structNode* tree;
tree=(structNode*)malloc(sizeof(structNode));
cin>>x;
if (x==0) {
tree=NULL;
}
else{
tree->data=x;
tree->left=Create();
tree->right=Create();
}
return tree;
}
void print(structNode* tree){//将二叉树放入的一个队列中
queue<structNode*>
q1;//创建一个队列用来存放节点
q1.push(tree);//首先将树的根节点放入
int last=-1;//定义两个数分别指向出栈的数字和队列中的最后一个数字
int nlast=tree->data;
while (!q1.empty()) {
last=q1.front()->data;//last指向队首元素
if (q1.front()->left!=NULL)
{//判读左子树是否为空不为空的话加入到队列中
q1.push(q1.front()->left);
}
if (q1.front()->right!=NULL)
{//判断右子树是否为空如果不为空加入到队列中
q1.push(q1.front()->right);
}
if (nlast==last) {//判断nlast和last是否相同如果相同就是这一层的最后一个输出换行
nlast=q1.back()->data;
cout<<q1.front()->data<<endl;
}
else{//不相同就输出数字和空格
cout<<q1.front()->data;
}
q1.pop();//出栈一个节点
}
}
int main()
{
structNode* tree;
tree=Create();
print(tree);
}
输出结果:
1
25
34
8
相关文章推荐
- 分层遍历二叉树(按层次从上往下,从左往右)
- 二叉树的层次遍历,从上到下和从下到上分层打印
- 与二叉树有关的一些操作:先序,中序,后序,层次遍历,计算深度,叶结点数
- 二叉树创建、前序遍历、中序遍历、后序遍历 的 递归与非递归实现 以及 层次遍历
- 层次遍历二叉树
- 分层遍历二叉树
- July 微软面试100题 第16题 二叉树的层次遍历
- 二叉树的层次遍历
- 层次遍历二叉树 ——微软面试题
- 面试题_分层遍历二叉树
- 二叉树的构建与层次遍历实现
- 分层遍历二叉树,每层输出为一行
- C#获取二叉树深度及分层遍历二叉树
- JAVA语言实现二叉树的层次遍历的非递归算法及递归算法。
- 《编程之美》:分层遍历二叉树
- 百度笔试题------层次遍历二叉树分析
- 根据层次遍历和中序遍历的结果还原一颗二叉树
- 编程之美读书笔记_3.8 求二叉树中节点的最大距离 和 3.10分层遍历二叉树 相关代码
- 分层遍历二叉树(编程之美3.10)
- 二叉树的创建及先根中根后根按层次遍历