题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
这道题也是二叉树的层次遍历,但要求按行打印,并且是之字形的,需要定义一个flag,确定这一行的打印顺序是从左到右还是从右至左。每行打印完,只要将flag取反,就可以改变下一行的打印顺序。
怎样按行打印呢?我们可以定义一个队列queue和一个数组level,队列queue存树的结点,数组level存每一行的值。在遍历每一行的循环开始前,先用一个变量len记录队列里的结点数目,这样就可以区分之后添加的儿子结点啦。尽管队列queue还有结点,但已经遍历了len个结点了,说明此时队列queue里都是新扩展的儿子结点了。
c++代码如下:
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>> res; 15 if(!pRoot) return res; 16 17 queue<TreeNode*> q; 18 q.push(pRoot); 19 bool rev = false; 20 21 while(q.size()){ 22 int len = q.size(); 23 vector<int> level; 24 for(int i = 0; i < len; i++){ 25 auto t = q.front(); 26 level.push_back(t->val); 27 if(t->left) q.push(t->left); 28 if(t->right) q.push(t->right); 29 q.pop(); 30 } 31 if(rev) reverse(level.begin(), level.end()); 32 rev = !rev; 33 res.push_back(level); 34 } 35 return res; 36 } 37 };