103.Binary Tree Zigzag Level Order Traversal
Difficulty:medium
Given a binary tree, return the zigzag level order traversal of its
nodes’ values. (ie, from left to right, then right to left for the
next level and alternate between).For example: Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its zigzag level order traversal as: [ [3], [20,9], [15,7] ]
解题思路
此题是一道关于树这样一个数据结构的展示问题。理解清楚题目中的数据结构的构成,这道题应该是不难解决的。不过要较为注意的几点是,数据的储存方式在单双数行间顺序是不同的。于是要加入基础的判定来区别单双数行的储存。
过程中遇到较为麻烦的事情是因为对于树这个结构很久没有使用(大二上学期之后就没用过了lol),一度不知道该如何存储每一行的信息。不过在复习之后就基本有了思路。
具体思路是扫描搜索上一层的节点的分支之后统计一下具体数目(我用了size保存),在生成下一层的vector时记得判断清楚何时该层结束(利用size)。
另外一个问题在于如何反转vector,不过这个有现成的函数就可以直接使用就好,也即是reverse函数。接下来是具体代码。
具体代码
/**
* 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>> zigzagLevelOrder(TreeNode* root) {
queue<TreeNode*> temp;
vector<vector<int>> ans;
vector<int> temp_ans;
TreeNode* node;
if(root == NULL)
return ans;
temp.push(root);
bool judge = false;
while(!temp.empty())
{
int size = temp.size();
temp_ans.clear();
for(int i = 0;i < size;i++)
{
node = temp.front();
temp.pop();
temp_ans.push_back(node->val);
if (node->left != NULL)
temp.push(node->left);
if (node->right != NULL)
temp.push(node->right);
}
if(judge)
{
reverse(temp_ans.begin(),temp_ans.end());
}
judge = 1 - judge;
ans.push_back(temp_ans);
}
return ans;
}
};