310. 最小高度樹

題目

樹是一個無向圖,其中任何兩個頂點只通過一條路徑連接。 換句話說,任何一個沒有簡單環路的連通圖都是一棵樹。

給你一棵包含?n?個節點的樹,標記為?0?到?n - 1?。給定數字?n?和一個有?n - 1?條無向邊的?edges?列表(每一個邊都是一對標簽),其中?edges[i] = [ai, bi]?表示樹中節點?ai?和?bi?之間存在一條無向邊。

可選擇樹中任何一個節點作為根。當選擇節點?x?作為根節點時,設結果樹的高度為?h?。在所有可能的樹中,具有最小高度的樹(即,min(h))被稱為?最小高度樹?。

請你找到所有的?最小高度樹?并按?任意順序?返回它們的根節點標簽列表。

樹的?高度?是指根節點和葉子節點之間最長向下路徑上邊的數量。

示例 1:

輸入:n = 4, edges = [[1,0],[1,2],[1,3]]
輸出:[1]
解釋:如圖所示,當根是標簽為 1 的節點時,樹的高度是 1 ,這是唯一的最小高度樹。

示例 2:

輸入:n = 6, edges = [[3,0],[3,1],[3,2],[3,4],[5,4]]
輸出:[3,4]

    提示:

    • 1 <= n <= 2 * 104
    • edges.length == n - 1
    • 0 <= ai, bi < n
    • ai != bi
    • 所有?(ai, bi)?互不相同
    • 給定的輸入?保證?是一棵樹,并且?不會有重復的邊

    思路

    ????????我們可以通過樹的直徑特性來尋找最小高度樹的根節點。我們可以先找到樹中兩個最遠節點之間的路徑,通過dfs可以確定樹的直徑,先從任意節點出發找到最遠節點x,再從x出發找到最遠節點y,路徑x-y就是樹的直徑,然后通過回溯路徑找到直徑的中心節點,如果直徑長度為奇數,中心為中間一個節點,如果為偶數,中心為中間兩個節點。

    代碼

    class Solution {
    public://更新所有節點到u的距離dist和父節點parentvoid dfs(int u, vector<int> & dist, vector<int> & parent, const     vector<vector<int>> & a) {for (size_t i=0;i<a[u].size();i++){int v=a[u][i];if (dist[v]<0)//鄰居v未被訪問{dist[v]=dist[u]+1;//更新距離parent[v]=u;//記錄父節點dfs(v,dist,parent,a);//遞歸訪問v}}}//從節點u出發,找到距離u最遠的節點,并返回該節點的編號int ll(int u,vector<int> &parent,const vector<vector<int>> &a){int n=a.size();vector<int> dist(n,-1);dist[u]=0;dfs(u,dist,parent,a);//更新距離和父節點int maxdist=0;int node=-1;for (int i=0;i<n;i++){if(dist[i]>maxdist){maxdist=dist[i];node=i;}}return node;}vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {if (n==1){return {0};}vector<vector<int>> a(n);//存每個節點的鄰居for (auto &edge:edges){a[edge[0]].emplace_back(edge[1]);a[edge[1]].emplace_back(edge[0]);}vector<int> parent(n, -1);//找到距離節點0最遠的節點xint x=ll(0,parent,a);//找到距離節點x最遠的節點yint y=ll(x,parent,a);//找到節點x到節點y的路徑vector<int> path;parent[x]=-1;while(y!=-1)//從節點y開始,沿著parent數組回溯到x,得到路徑path{path.emplace_back(y);//存儲的是從y到x的路徑y=parent[y];}int m=path.size();if (m%2==0)//兩個節點{return {path[m/2-1],path[m/2]};}else//一個節點{return {path[m/2]};}}
    };

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

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

    相關文章

    Axure 縱向滾動隱藏滾動條 Axure 滑動開關(屬性開關)on-off

    文章目錄 I 滑動開關(屬性開關)操作說明block 矩形操作說明round小圓圈操作說明on-off 屬性開關組合操作說明II Axure 縱向滾動隱藏滾動條思路包含圖片的動態面板1操作說明包含動態面板的頂級動態面板I 滑動開關(屬性開關)操作說明 block 矩形操作說明 在畫布中添加一個矩形…

    MySQL之基礎事務

    目錄 引言&#xff1a; 什么是事務&#xff1f; 事務和鎖 mysql數據庫控制臺事務的幾個重要操作指令&#xff08;transaction.sql&#xff09; 1、事物操作示意圖&#xff1a; 2.事務的隔離級別 四種隔離級別&#xff1a; 總結一下隔離指令 1. 查看當前隔離級別?? …

    VS Code 重磅更新:全新 MCP 服務器發現中心上線

    目前各種 MCP 客戶端層出不窮&#xff0c;但是安裝 MCP 服務卻格外繁瑣&#xff0c;尤其 VS Code 中無界面化的 MCP 服務配置方式&#xff0c;效率較低。 Copilot MCP 是一個 VS Code 插件&#xff0c;在今天發布的新版本中&#xff0c;插件支持了自動發現與安裝開源 MCP 服務…

    智能家居“心臟“升級戰:GD25Q127CSIG國產芯片如何重構家庭物聯生態

    在智能家居設備出貨量突破10億臺的2023年&#xff0c;家庭網關正經歷著前所未有的技術革新。作為連接云端與終端設備的中樞神經&#xff0c;智能網關的存儲芯片選擇直接決定著整個智能生態系統的運行效率。在這場技術升級浪潮中&#xff0c;兆易創新GD25Q127CSIG串行閃存芯片主…

    R語言機器學習算法實戰系列(二十五)隨機森林算法多標簽分組分類器及模型可解釋性

    禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹教程內容加載必要的R包(帶詳細注釋)1. 加載數據2. 數據分割(按Species分層抽樣)3. 數據預處理配方4. 創建隨機森林模型(多分類)5. 創建工作流6. 設置交叉驗證和參數調優7. 參…

    速查 Linux 常用指令 II

    目錄 一、網絡管理命令1. 查看和配置網絡設備&#xff1a;ifconfig1&#xff09;重啟網絡命令2&#xff09;重啟網卡命令 2. 查看與設置路由&#xff1a;route3. 追蹤網絡路由&#xff1a;traceroute4. 查看端口信息和使用情況1&#xff09;netstat 命令2&#xff09;lsof 命令…

    關于github使用總結

    文章目錄 一、本地使用git&#xff08;一&#xff09;創建一個新的本地Git庫首先在本地創建一個新的git倉庫然后進行一次初始提交提交過后就可以查看提交記錄 &#xff08;二&#xff09;在本地倉庫進行版本恢復先執行 git log 查看項目提交歷史使用 git checkout 恢復版本 二、…

    【Python】Python 單例模式 8 大核心應用場景深度解析(2025 新版)

    單例模式&#xff08;Singleton Pattern&#xff09;作為一種經典的設計模式&#xff0c;始終保持著重要的工程價值。 本文著重于單例模式的主要核心應用場景。 至于實現方法&#xff0c; 晚些時候發出。 一、配置管理器 全局配置信息管理是單例模式最典型的應用場景。通過單…

    計算機網絡網絡層(下)

    一、互聯的路由選擇協議&#xff08;網絡層控制層面內容&#xff09; &#xff08;一&#xff09;有關路由選擇協議的幾個概念 1.理想的路由算法 &#xff08;1&#xff09;理想路由算法應具備的特點&#xff1a;算法必須正確和完整的&#xff0c;算法在計算上應簡單&#x…

    云存儲桶的“公開陷阱”|滲透測試中如何利用與防御配置錯誤的存儲服務

    引言 云存儲服務&#xff08;如AWS S3、阿里云OSS、Google Cloud Storage&#xff09;因便捷性被企業廣泛使用&#xff0c;但權限配置錯誤卻成為近年來數據泄露的重災區。 攻擊者無需復雜漏洞&#xff0c;僅需一個公開鏈接即可下載敏感數據。本文將深入解析這類漏洞的滲透…

    BitMart合約交易體驗 BitMart滑點全賠的底層邏輯

    美國新澤西州澤西市&#xff0c;2025年5月13日 – BitMart&#xff0c;全球領先的數字資產交易平臺&#xff0c;推出了其開創性的滑點保護計劃&#xff0c;旨在解決加密市場中最具挑戰性且常常被忽視的風險之一&#xff1a;滑點。該計劃為交易者提供了在 USDT 保證金永續合約交…

    高海拔和遠距離的人員識別:面部、體型和步態的融合

    大家讀完就覺得有幫助記得關注和點贊&#xff01;&#xff01;&#xff01; 摘要 我們解決了在無約束環境中進行全身人體識別的問題。這個問題出現在諸如IARPA高空和遠距離生物識別與身份識別&#xff08;BRIAR&#xff09;計劃等監視場景中&#xff0c;其中生物識別數據是在長…

    Docker 常見問題及其解決方案

    一、安裝與啟動問題 1.1 安裝失敗 在不同操作系統上安裝 Docker 時&#xff0c;可能會出現安裝失敗的情況。例如&#xff0c;在 Ubuntu 系統中&#xff0c;執行安裝命令后提示依賴缺失。這通常是因為軟件源配置不正確或系統缺少必要的依賴包。 解決方案&#xff1a; 確保系統…

    影響力最小化

    這里寫目錄標題 影響力最大化**創新點**參數設置 影響力最小化傳播模型該文獻和Budak的有什么不同呢a Linear Threshold model with One Direction state Transition (LT1DT)具體模型 影響力最大化 以INFORMS Journal on Computing為例《The Impact of Passive Social Media Vi…

    【IDEA】注釋配置

    1. IDEA注釋調整&#xff0c;去掉默認在第一列顯示 修改為如下&#xff1a; 2. IDEA中修改代碼中的注釋顏色

    一文了解 HTTP Content-Type:從基礎到實戰

    一文了解 HTTP Content-Type&#xff1a;從基礎到實戰 在 Web 開發中&#xff0c;HTTP 請求頭中的 Content-Type 是一個看似簡單卻至關重要的概念。它決定了瀏覽器和服務器如何解析和處理傳輸的數據。本文將帶你全面掌握 Content-Type 的核心知識&#xff0c;涵蓋常見類型、應…

    兔子隊列?RabbitMQ詳解(1)

    引入 首先先介紹一下什么是 RabbitMQ 的意思:Rabbit 是一個公司的名稱,MQ 是 message queue (消息隊列)的縮寫,而 RabbitMQ 是 Rabbit 企業下的一個消息隊列產品,是一個采用Erlang語言實現AMQP(Advanced Message Queuing Protocol,高級消息隊列協議)的消息中間件,它最初…

    某智能家電龍頭,社招 校招全面應用 AI 面試的創新實踐

    某智能家電龍頭在競爭中憑借創新能力和高品質服務穩居市場前列&#xff0c;為更好地賦能業務&#xff0c;集團招聘總監著力構建數字化招聘流程&#xff0c;率先引入 AI 面試實現招聘智能化升級&#xff0c;減輕 HR 負擔、提升效率&#xff0c;優化候選人體驗&#xff0c;達成雙…

    STM32 實時時鐘(RTC)詳解

    一、RTC 簡介 RTC&#xff08;Real Time Clock&#xff09;即實時時鐘&#xff0c;本質上是一個 32 位的秒級計數器&#xff1a; 最大計數值為 4294967295 秒&#xff0c;約合 136 年&#xff1a; 復制編輯 4294967295 / 60 / 60 / 24 / 365 ≈ 136 年 RTC 初始化時&#x…

    《AI驅動的智能推薦系統:原理、應用與未來》

    一、引言 在當今信息爆炸的時代&#xff0c;用戶面臨著海量的信息選擇&#xff0c;從購物平臺上的商品推薦到流媒體服務中的影視推薦&#xff0c;智能推薦系統已經成為我們日常生活中不可或缺的一部分。AI驅動的智能推薦系統通過分析用戶的行為和偏好&#xff0c;為用戶提供個性…