牛客网剑指Offer系列——将二叉树打印多行
题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
题目解析
很明显的层序遍历二叉树,BFS算法。用一个队列来保存层序遍历的数据,last指针指向上层的最后一个元素,nlast指针为移动指针,在上一层中移动,并将nlast的值加入到vec_son,同时将nlast的左右儿子加入到队列中来。当nlast移动到last时,表示上一层已经遍历结束,将vec_son加入到vec_father中,last指向队尾,nlast继续往下遍历,直到队列遍历结束。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
//this is a BFS algorithm.
//create a queue to save data.
TreeNode* queue[510];
TreeNode* last=pRoot;
TreeNode* nlast=pRoot;
vector<int> vec_son;
vector<vector<int>> vec_father;
queue[0]=pRoot;
for(int i=1,j=1;queue[j-1]!=NULL;){
vec_son.push_back(nlast->val);
if(nlast->left!=NULL){
queue[i++]=nlast->left;
}
if(nlast->right!=NULL){
queue[i++]=nlast->right;
}
if(nlast==last){
last=queue[i-1];
vec_father.push_back(vec_son);
vec_son.clear();
}
nlast=queue[j++];
}
return vec_father;
}
};