【圖論題典】Swift 解 LeetCode 最小高度樹:中心剝離法詳解

在這里插入圖片描述
在這里插入圖片描述

文章目錄

    • 摘要
    • 描述
    • 題解答案
    • 題解代碼分析
      • 思路來源:樹的“中心剝離法”
      • 構造鄰接表和度數組
      • 循環剝葉子
      • 終止條件
    • 示例測試及結果
    • 時間復雜度
    • 空間復雜度
    • 總結

摘要

樹是一種重要的數據結構,在許多應用里,我們希望選一個根,讓這棵樹的高度最小。LeetCode 310 就是這樣一道題:給你無向樹結構,選出所有可能成為“最小高度根”的節點。本文用 Swift 實現專業級解法,附上可運行代碼、過程圖解和復雜度分析,讓你從思路到實現完全掌握。這對理解中樞化圖結構、分層遍歷特別有幫助,既能用于面試,也有真實網絡或社交分析場景借鑒價值。

描述

題目定義:給定 n 個節點和 n–1 條無向邊,它構成一棵樹(連通且無環)。我們可以任選一個節點作為根,這樣就有一個高度;求所有能使樹高度最小的根節點。

幾個入門例子:

  • n = 4, edges = [[1,0],[1,2],[1,3]],根選 1 時高度是 1,是最小的,答案 [1]
  • n = 6, edges = [[3,0],[3,1],[3,2],[3,4],[5,4]],答案 [3,4],兩者都是中心節點

這道題通過連續“剝離”葉子節點的辦法,能高效找到中心節點。

題解答案

func findMinHeightTrees(_ n: Int, _ edges: [[Int]]) -> [Int] {guard n > 1 else { return [0] }var adj = Array(repeating: [Int](), count: n)var degree = Array(repeating: 0, count: n)for e in edges {adj[e[0]].append(e[1])adj[e[1]].append(e[0])degree[e[0]] += 1degree[e[1]] += 1}var leaves = [Int]()for i in 0..<n where degree[i] == 1 {leaves.append(i)}var count = nwhile count > 2 {count -= leaves.countvar newLeaves = [Int]()for leaf in leaves {for nei in adj[leaf] {degree[nei] -= 1if degree[nei] == 1 { newLeaves.append(nei) }}}leaves = newLeaves}return leaves
}

這段代碼直接運行就可返回最小高度樹的所有根節點,非常簡潔。

題解代碼分析

思路來源:樹的“中心剝離法”

  1. 從樹的葉子(度為 1)開始,逐層往內“剝離”節點。
  2. 每剝掉一層葉子,就把剩余節點數減去。
  3. 當剩下 ≤2 個節點時,它們就是樹的中心(中點),即所求根。

這個過程類似處理拓撲排序,復雜度優雅。

構造鄰接表和度數組

adj 存儲鄰居節點,degree 存儲當前節點的度數,初始準備葉子。

循環剝葉子

每次把當前所有葉子節點剝掉,并更新它們鄰居的度數;新的度為 1 的節點加入下一層葉子。

終止條件

剩余節點 ≤2 時,剝離結束。此時的 leaves 就是能成為最小高度樹根的集合。

示例測試及結果

print(findMinHeightTrees(4, [[1,0],[1,2],[1,3]])) // 輸出 [1]
print(findMinHeightTrees(6, [[3,0],[3,1],[3,2],[3,4],[5,4]])) // 輸出 [3,4]
print(findMinHeightTrees(1, [])) // 輸出 [0]
print(findMinHeightTrees(2, [[0,1]])) // 輸出 [0,1]

以上示例覆蓋了最小樹、單節點、雙節點等邊界情況,驗證結果都正確。

時間復雜度

  • 構造圖和度數:O(n)
  • 剝離所有葉子:每個節點最多被剝一次,邊最多處理一次,綜合 O(n)

所以整體時間復雜度是 O(n),非常高效,適合 n ~2×10? 的場景。

空間復雜度

  • 存圖結構 adj: O(n)
  • 存度數數組 degree: O(n)
  • 臨時葉子列表 leaves: O(n)(通常遠小于 n)

總體空間復雜度是 O(n)

總結

  • 算法核心是找到樹中心,通過 “多層剝葉” 思路解決,既直觀又高效。

  • 使用場景

    • 在圖論中求最短廣播源點
    • 網絡模塊尋找延遲最低的通信節點
    • 社交網絡中尋找信息傳播中樞
  • Swift 實現簡潔明快,剝離過程邏輯清晰,適合算法面試與項目落地。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86710.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86710.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86710.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker的介紹與安裝

? Docker 對初學者的簡單解釋和應用場景 1.什么是 Docker&#xff1f; 簡單來說&#xff0c;Docker 就像一個“裝箱子”的工具&#xff0c;這個箱子叫做“容器”。 你寫的程序和它運行需要的環境&#xff08;比如操作系統、軟件、工具&#xff09;都裝進一個箱子里。這個箱…

引導相機:工業自動化的智能之眼,賦能制造業高效升級

在工業自動化浪潮中&#xff0c;精準的視覺引導技術正成為生產效率躍升的關鍵。作為遷移科技——一家成立于2017年、專注于3D工業相機和3D視覺系統的領先供應商&#xff0c;我們深知"引導相機"的核心價值&#xff1a;它不僅是一個硬件設備&#xff0c;更是連接物理世…

智能相機如何重塑工業自動化?遷移科技3D視覺系統的場景革命

從硬件參數到產業價值&#xff0c;解碼高精度視覺系統的落地邏輯 一、工業視覺的“智慧之眼” 遷移科技深耕3D工業相機領域&#xff0c;以“穩定、易用、高回報”為核心理念&#xff0c;打造覆蓋硬件、算法、軟件的全棧式視覺系統。成立6年累計融資數億元的背后&#xff0c;是…

【數據挖掘】聚類算法學習—K-Means

K-Means K-Means是一種經典的無監督學習算法&#xff0c;用于將數據集劃分為K個簇&#xff08;clusters&#xff09;&#xff0c;使得同一簇內的數據點相似度高&#xff0c;不同簇間的相似度低。它在數據挖掘、模式識別和機器學習中廣泛應用&#xff0c;如客戶細分、圖像壓縮和…

linux環境內存滿php-fpm

檢查 PHP-FPM 配置 pm.max_children&#xff1a;該參數控制 PHP-FPM 進程池中最大允許的子進程數。過高的子進程數會導致內存占用過大。你可以根據服務器的內存大小來調整 pm.start_servers&#xff1a;控制 PHP-FPM 啟動時創建的進程數。根據實際情況調整此值。 pm.min_spare_…

基于CNN卷積神經網絡圖像識別小程序9部合集

基于CNN卷積神經網絡圖像識別小程序合集-視頻介紹下自取 ? 內容包括&#xff1a; 基于python深度學習的水果或其他物體識別小程序 003基于python深度學習的水果或其他物體識別小程序_嗶哩嗶哩_bilibili 代碼使用的是python環境pytorch深度學習框架&#xff0c;代碼的環境安…

WebRTC(九):JitterBuffer

JitterBuffer Jitter “Jitter”指的是連續到達的媒體包之間時間間隔的變化。在網絡傳輸中&#xff0c;由于&#xff1a; 網絡擁塞路由路徑變化隊列排隊不同鏈路帶寬差異 導致包之間的接收時間不一致&#xff0c;這就是網絡“抖動”。 作用 **JitterBuffer&#xff08;抖…

【推薦100個unity插件】在 Unity 中繪制 3D 常春藤,模擬生長——hedera插件的使用

注意&#xff1a;考慮到后續接觸的插件會越來越多&#xff0c;我將插件相關的內容單獨分開&#xff0c;并全部整合放在【推薦100個unity插件】專欄里&#xff0c;感興趣的小伙伴可以前往逐一查看學習。 效果演示 文章目錄 效果演示前言一、常春藤生成器工具下載二、工具使用1、…

【三維重建】【3DGS系列】【深度學習】3DGS的理論基礎知識之高斯橢球的幾何變換

【三維重建】【3DGS系列】【深度學習】3DGS的理論基礎知識之高斯橢球的幾何變換 文章目錄 【三維重建】【3DGS系列】【深度學習】3DGS的理論基礎知識之高斯橢球的幾何變換前言模型變換(Model Transformation)觀測變換(Viewing Transformation)視圖變換(View Transformation)投影…

EXISTS 和 NOT EXISTS 、IN (和 NOT IN)

在 SQL 中&#xff0c;EXISTS、NOT EXISTS 和 IN 都是用于子查詢的條件運算符&#xff0c;用于根據子查詢的結果過濾主查詢的行。它們之間的區別主要體現在工作方式、效率、對 NULL 值的處理以及適用場景上。 1. EXISTS 和 NOT EXISTS 作用&#xff1a; EXISTS: 檢查子查詢是…

GitHub 趨勢日報 (2025年06月25日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖 880 awesome 788 build-your-own-x 691 free-for-dev 427 best-of-ml-python 404 …

互聯網大廠Java求職面試:Java虛擬線程實戰

互聯網大廠Java求職面試&#xff1a;Java虛擬線程實戰 文章內容 開篇&#xff1a;技術總監與程序員鄭薪苦的三輪對話 在一場緊張而嚴肅的Java工程師面試中&#xff0c;技術總監張工正對候選人鄭薪苦進行深入提問。鄭薪苦雖然性格幽默&#xff0c;但對技術有著扎實的理解。今天…

網絡安全的兩大威脅:XSS與CSRF攻擊實例解析

在網絡攻擊中,XSS跨站腳本攻擊(Cross Site Scripting)與CSRF跨站請求偽造攻擊(Cross-Site Request Forgery)是兩種常見的攻擊方式,它們之間存在顯著的區別。以下是對這兩種攻擊方式的詳細比較: 一、攻擊原理 XSS跨站腳本攻擊 攻擊者通過在Web頁面中注入惡意腳本來實現攻…

如何一次性將 iPhone 中的聯系人轉移到 PC

許多重要的聯系人都存儲在您的 iPhone 上。為了保護關鍵信息&#xff0c;您可能需要將聯系人從 iPhone 轉移到 PC&#xff0c;這是一種有效的聯系人備份方法。如果您在將 iPhone 聯系人轉移到電腦上遇到困難&#xff0c;現在可以從本文中學習 5 個有效的解決方案&#xff0c;然…

Spring Boot開啟定時任務的三種方式 【@EnableScheduling注解,SchedulingConfigurer接口,Quartz 框架】

Spring Boot 開啟定時任務的三種方式? ? ? 在 Spring Boot 應用開發過程中&#xff0c;定時任務是十分常見的需求&#xff0c;比如定時清理日志文件、定期備份數據庫數據、定時發送郵件提醒等。Spring Boot 提供了多種開啟定時任務的方式&#xff0c;本文將詳細介紹三種常見…

LLM 編碼器 怎么實現語義相關的 Token 向量更貼近? mask訓練:上下文存在 ;; 自回歸訓練:只有上文,生成模型

LLM 編碼器 怎么實現語義相關的 Token 向量更貼近? 目錄 LLM 編碼器 怎么實現語義相關的 Token 向量更貼近?mask訓練:上下文存在自回歸訓練:只有上文,生成模型一、核心機制:損失函數與反向傳播的“語義校準”1. 損失函數的“語義約束”2. 嵌入層參數的“動態調整”二、關…

從OCR瓶頸到結構化理解來有效提升RAG的效果

當人們探討如何讓人工智能系統更好地從文檔中查找和使用信息時&#xff0c;通常關注的是令人矚目的算法和前沿的大型語言模型。但問題是&#xff1a;如果文本提取的質量很差&#xff0c;那么后續的努力都將付諸東流。本文探討OCR質量如何影響檢索增強生成&#xff08;RAG&#…

SpringBoot -- 整合Junit

11.SpringBoot 整合 Junit 11.1 為什么需要單元測試 由于在SpringBoot開發過程中&#xff0c;每開發一個模塊&#xff0c;有時需要從 controller、service、mapper 到甚至 xml 文件的編寫全部開發完畢才能進行測試&#xff0c;這是十分浪費時間的&#xff0c;比如開發人員想測…

虛擬機遠程連接編譯部署QT程序

概要 邏輯 我們需要湊齊 QT庫、交叉編譯工具、sysroot這三大件。 交叉編譯的程序是部署到板卡環境運行,需要構建和板卡一樣的庫環境。 sysroot是我們在虛擬機上自己命名的一個文件夾,包含開發板的運行系統所需的所有文件。 虛擬機是x64版本,開發板是arm64版本。 如果開發板…

基于SpringBoot的智慧旅游系統

以智慧旅游系統的設計與實現為研究對象&#xff0c;旨在通過科技手段提升旅游業的管理效能和游客體驗。在系統設計方面&#xff0c;深入分析了地理特征、豐富的文化底蘊以及多樣的自然景觀。結合這些獨特之處&#xff0c;構建了一個多層次的旅游管理系統&#xff0c;包括景點信…