难度评级:中等
给你二叉树的根节点 root
,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:[[3],[20,9],[15,7]]
题解思路:DFS、头插法、尾插法
本题在层序遍历的基础上,需要得到锯齿序列,简单来说就是将奇数项(1、3、5......)的序列进行反转,这里提供两个思路,一个是直接利用reverse函数将奇数项vector进行反转,本文采用的是第二种方法,在插入元素的时候,对deep进行判断,当deep为偶数时,直接插入尾部即可,如果deep为奇数时,利用insert函数插入头部即可。
题解代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> res;
void pre_DFS(TreeNode* root, int deep, vector<vector<int>>& res){
if (root == NULL){
return;
}
if (deep >= res.size()){
res.push_back(vector<int> {}); // 扩容
}
cout << deep << endl;
if (deep % 2 != 0){ // 将奇数层通过头插法反转
res[deep].insert(res[deep].begin(), root->val);
}else{
res[deep].push_back(root->val);
}
pre_DFS(root->left, deep + 1, res); // 遍历左子树
pre_DFS(root->right, deep + 1,res); // 遍历右子树
}
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
pre_DFS(root, 0, res);
return res;
}
};