题目描述:
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
解题思路:
使用队列保存每一行遍历的结果,如果遇到偶数行,则翻转下这一层的遍历结果。
Demo:
/*
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) {
vector<vector<int>> res;
if (pRoot == nullptr) return res;
// 广搜用队列保存每一行的结果
queue<TreeNode*> que;
que.push(pRoot);
vector<int> vec_tmp;
int i = 0;
while (!que.empty()){
i++;
int len = que.size();
// 队列的长度表示每一层有多少个元素
for (int i = 0; i < len; ++i){
TreeNode *node = que.front();
que.pop();
vec_tmp.push_back(node->val);
if (node->left != nullptr)
que.push(node->left);
if (node->right != nullptr)
que.push(node->right);
}
// 记录层数,偶数层则反转下该层的结果
if (!(i & 1))
reverse(vec_tmp.begin(), vec_tmp.end());
res.push_back(vec_tmp);
vec_tmp.clear();
}
return res;
}
};