剑指offer-把二叉树打印成多行

 

题目描述

 
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
 

解题思路

 

还是用层序遍历的思想,设置一个队列初始推入根节点,每次删除队列顶的节点时,打印出来结点值,若其有左右子节点,则将左右子节点依次推入队列,如此遍历直到队列为空。

由于本题要求逐行输出,所以需要设置两个变量来保持分行:needPrint记录当前行仍需打印的节点数,nextLevel记录下一行需要打印的节点数。每打印完一个节点,将当前行剩下的结点数needPrint减1;每向队列放入一个子节点,将下一行的节点数nextLevel加1。打印完节点后若needPrint为0,则说明当前行节点已全部打印完,所以将needPrint设置为下一行的节点数nextLevel,同时将nextLevel置0.

 

代码

 

 1 /*
 2 struct TreeNode {
 3     int val;
 4     struct TreeNode *left;
 5     struct TreeNode *right;
 6     TreeNode(int x) :
 7             val(x), left(NULL), right(NULL) {
 8     }
 9 };
10 */
11 class Solution {
12 public:
13         vector<vector<int> > Print(TreeNode* pRoot) {
14             vector<vector<int> > vs;
15             if(pRoot){
16                 vector<int> v;
17                 queue<TreeNode*> q;
18                 q.push(pRoot);
19                 int needPrint=1;
20                 int nextLevel=0;
21                 while(q.size()){
22                     TreeNode* node=q.front();
23                     v.push_back(node->val);
24                     needPrint--;
25                     q.pop();
26                     if(node->left){
27                         q.push(node->left);
28                         nextLevel++;
29                     }
30                     if(node->right){
31                         q.push(node->right);
32                         nextLevel++;
33                     }
34                     if(needPrint==0){
35                         vs.push_back(v);
36                         v.clear();
37                         needPrint=nextLevel;
38                         nextLevel=0;
39                     }
40                 }
41             }
42             return vs;
43         }
44     
45 };

 

posted @ 2018-04-22 11:34  FlyingWarrior  阅读(175)  评论(0编辑  收藏  举报