題目網址:https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/
題意:給一 BT 的 root
, 返回 node.val
由下往上的 level order(由下層往上層, 每層由左至右)。


Solution 1:
想法:利用 BFS, 同 102. Binary Tree Level Order Traversal, 只是多了 reverse
class Solution { public: vector<vector<int>> levelOrderBottom(TreeNode* root) { if (!root) { return {}; }
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); } }
res.emplace_back(level); }
reverse(res.begin(), res.end());
return res; } };
|
- time:$O(n)$ ➔ 每個 node 皆被遍歷一次
- space:$O(n)$ ➔ 撇除要返回的
res
, 在 while loop 迭代的過程中, q
的元素個數不超過 n
Solution 2:
想法:利用 DFS, 同 102. Binary Tree Level Order Traversal, 只是多了 reverse
class Solution { public: vector<vector<int>> levelOrderBottom(TreeNode* root) { vector<vector<int>> res; dfs(root, 0, res); reverse(res.begin(), res.end()); return res; }
private: void dfs(TreeNode* root, const 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