题目描述

给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[20,9],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000] 内

  • -100 <= Node.val <= 100


思路

参考层次遍历,现在多了一条奇数行要反着来。同样可以使用队列和递归两种方式。

// 递归:先层次遍历,再翻转奇数行
vector<vector<int>> zigzagLevelOrder1(TreeNode* root) {
    vector<vector<int>> ans;
    auto travel = [&](this auto&& travel, TreeNode* node, int depth) {
        if (!node) return;
        if (ans.size() <= depth) {
            ans.resize(depth + 1);
        }
        ans[depth].push_back(node->val);
        travel(node->left, depth + 1);
        travel(node->right, depth + 1);
 
    };
    travel(root, 0);
    // 反转奇数行
    for (int i = 0; i < ans.size(); ++i) {
        if (i & 1) {
            std::reverse(ans[i].begin(), ans[i].end());
        }
    }
    return ans;
}
 
// 循环:用队列辅助,bfs
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
    vector<vector<int>> ans;
    if (!root) return ans;
 
    queue<TreeNode*> q;
    q.push(root);
    while (!q.empty()) {
        int depth = ans.size();
        int n = q.size(); // 这一层有n个元素
        vector<int> vals(n);
        for (int i = 0; i < n; ++i) {
            auto p = q.front();
            q.pop();
 
            // 奇数层反着来
            vals[depth & 1 ? n - 1 - i : i] = p->val;
            if (p->left) q.push(p->left);
            if (p->right) q.push(p->right);
        }
        ans.push_back(std::move(vals));
    }
    return ans;
}