題目網址:https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal/

題意:給一 BT 的 root, 返回 node.val 的 zigzag(鋸齒形)level order(先從左往右, 而下一層從右往左遍歷, 依此類推, 層與層之間交替進行)。

Solution 1:

想法:利用 BFS

class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
if (!root) {
return {};
}

int depth = 0;
vector<vector<int>> res;
queue<TreeNode*> q;
q.emplace(root);

while (!q.empty()) {
const int len = q.size();
vector<int> level;

for (int i = 0; i < len; ++i) {
const auto cur = q.front();
q.pop();
level.emplace_back(cur->val);

if (cur->left) {
q.emplace(cur->left);
}

if (cur->right) {
q.emplace(cur->right);
}
}

if (depth % 2 == 1) {
reverse(level.begin(), level.end());
}

depth++;
res.emplace_back(level);
}

return res;
}
};
  • time:$O(n)$ ➔ 每個 node 皆被遍歷一次
  • space:$O(n)$ ➔ 撇除要返回的 res, 在 while loop 迭代的過程中, q 的元素個數不超過 n

Solution 2:

想法:利用 DFS

class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> res;
dfs(root, 0, res);
for (int i = 1; i < res.size(); i += 2) {
reverse(res[i].begin(), res[i].end());
}
return res;
}

private:
void dfs(TreeNode* root, int depth, vector<vector<int>>& res){
if (!root) {
return;
}

while (res.size() <= depth) {
res.emplace_back(vector<int>{});
}

res[depth].emplace_back(root->val);
dfs(root->left, depth + 1, res);
dfs(root->right, depth + 1, res);
}
};
  • time:$O(n)$ ➔ 每個 node 皆被遍歷一次
  • space:$O(n)$ ➔ 遞迴深度不超過 n