一、题目:剑指 Offer 32 - III. 从上到下打印二叉树 III
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
二、思路和代码:
这个时候和 剑指 Offer 32 - I. 从上到下打印二叉树不同,这里需要一个二维数组来存放结果。
将每一层都压入一个数组中,然后在将这个数组压入二维数组中去。
和剑指 Offer 32 - II. 从上到下打印二叉树 II唯一不同的就是在一维数组放入二维数组中判断一下层数,奇数层翻转一下(数组从0开始)即可。
具体做法见代码注释:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode* >q;//创建队列
if(root)q.push(root);//如果这棵树不为空,根节点入队
vector<vector<int>>res;//创建二维数组存放最终结果
while(!q.empty()){//当队列不为空时候将一维数组的元素压入二维数组
vector<int>res1; //定义一维数组
int n=q.size();
for(int i=0;i<q.size();i++){//将每一层的各个元素压入一维数组
TreeNode* temp =q.front(); //temp指向队头
res1.push_back(q.front()->val);//压入数组中
q.pop();//压入的元素出队
if(temp->left)q.push(temp->left);//将队头的左右元素(也就是进入一维数组节点的下一层)放到队列中
if(temp->right)q.push(temp->right);
}
//*****和剑指 Offer 32 - II. 从上到下打印二叉树 II唯一不同的一行↓↓↓↓↓↓↓↓↓****
if(res.size()%2==1)reverse(res1.begin(),res1.end());//判断层数,奇数层翻转一下
res.push_back(res1);//把一维的数组放到二维数组
}
return res;
}
};
怕什么真理无穷,进一步有进一步的欢喜!