給定一棵二叉樹,返回其節點值的層序遍歷結果(從根層到葉子層,每層從左到右)。
範例:
輸入: {3,9,20,#,#,15,7}
3
/ \
9 20
/ \
15 7
輸出: [[3], [9,20], [15,7]]
使用佇列實現廣度優先搜索,關鍵是每次處理完當前佇列中所有節點即完成一層:
sz(即當前層節點數)sz 次:出隊節點、收集值、入隊左右子節點時間複雜度:O(n),空間複雜度:O(n)(佇列最多存儲一層節點)。
/**
* 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> levelOrder(TreeNode* root) {
vector> ans;
if (!root) return ans;
queue q;
q.push(root);
while (!q.empty()) {
int sz = q.size();
vector level;
level.reserve(sz);
for (int i = 0; i < sz; ++i) {
TreeNode* node = q.front(); q.pop();
level.push_back(node->val);
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
ans.push_back(move(level));
}
return ans;
}
};
from collections import deque
class Solution:
def levelOrder(self, root):
if not root:
return []
ans = []
q = deque([root])
while q:
level = []
for _ in range(len(q)):
node = q.popleft()
level.append(node.val)
if node.left: q.append(node.left)
if node.right: q.append(node.right)
ans.append(level)
return ans
for _ in range(len(q)) 固定當前層處理次數,避免混入下層節點queue,Python 用 deque(O(1) 雙端操作)move(level) 避免 vector 拷貝開銷reverse(ans) 即可層序遍歷是二叉樹題目的基礎模板,熟練掌握「佇列 + 當前層大小」模式,可解決 90% 的樹分層問題。