首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode 102 二叉樹層序遍歷:自頂向下逐層輸出

     編輯:關於C++

LeetCode 102 二叉樹層序遍歷:自頂向下逐層輸出


題目描述

給定一棵二叉樹,返回其節點值的層序遍歷結果(從根層到葉子層,每層從左到右)。

範例:

輸入: {3,9,20,#,#,15,7}
    3
   / \
  9  20
    /  \
   15   7

輸出: [[3], [9,20], [15,7]]

解題思路:標準 BFS 分層遍歷

使用佇列實現廣度優先搜索,關鍵是每次處理完當前佇列中所有節點即完成一層:

  1. 佇列初始放入根節點
  2. 當佇列不為空:
  3. 記錄當前佇列大小 sz(即當前層節點數)
  4. 循環 sz 次:出隊節點、收集值、入隊左右子節點
  5. 將當前層收集的值加入結果

時間複雜度:O(n),空間複雜度:O(n)(佇列最多存儲一層節點)。

C++ 參考實現

/**
 * 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;
    }
};

Python 參考實現

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)) 固定當前層處理次數,避免混入下層節點
  • 佇列選擇:C++ 用 queue,Python 用 deque(O(1) 雙端操作)
  • 移動語義:C++ move(level) 避免 vector 拷貝開銷
  • 變體延伸:LeetCode 107 只需在最後 reverse(ans) 即可

層序遍歷是二叉樹題目的基礎模板,熟練掌握「佇列 + 當前層大小」模式,可解決 90% 的樹分層問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved