参考文献:revers函数源码解析(侵删侵删侵删,重要的事情说三遍)
题目
原题链接
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
思路
(说句大言不惭的话)这题真的简单……
首先,层次遍历一下,将遍历到的结果存储在二维容器中,不要考虑每一层的正反问题,直接存储即可。
关于层序遍历与存储结果,leetcode
的 102.二叉树的层序遍历
不错,这里厚颜无耻地推荐一下自己的题解:leetcode T-102
然后是逆转偶数行的存储,用到了reverse函数,该函数的作用是将一个数组/容器的顺序颠倒过来,详见revers函数源码解析。
说是逆转偶数行,其实是要逆转第1,3,5,7……行,因为vector容器默认是从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>> ans;
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
if(!root) return ans;
digit(root, 0);
int n = ans.size();
for(int i = 1; i < n; i += 2) {
reverse(ans[i].begin(), ans[i].end());
}
return ans;
}
void digit(TreeNode* root, int deep) {
if(!root) return ;
if(deep >= ans.size()) ans.push_back(vector<int> {});
ans[deep].push_back(root -> val);
digit(root -> left, deep + 1);
digit(root -> right, deep + 1);
}
};