LeetCode-310 最小高度树

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-height-trees

题目描述

树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,一个任何没有简单环路的连通图都是一棵树。

给你一棵包含 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求出最小树高度,时间复杂度为O(n2),不出所料超时了。由于没有想到根结点会是最长路径的中点这个规律,所以使用了拓扑的思路,时间复杂度有点高。

基本思路是每次都减除叶子结点,当某一刻减除叶子结点后树为空了,那么上一次减除的叶子结点就是最小高度树的根,可能是一个也可能是两个。

代码展示

复制代码
class Solution {
public:
    vector<vector<int>> vviRelation;
    int iMin;
    vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {
        vector<int> viRet, viDu(n, 0);
        vviRelation.resize(n);
        unordered_set<int> setiNode;
        for(int i = 0; i < n; i++)
            setiNode.insert(i);
        for(auto iter: edges)
        {
            vviRelation[iter[0]].push_back(iter[1]);
            vviRelation[iter[1]].push_back(iter[0]);
            viDu[iter[0]]++;
            viDu[iter[1]]++;
        }

        while(!setiNode.empty())
        {
            viRet.resize(0);
            for(auto iter: setiNode)
            {
                if(viDu[iter] == 1 || viDu[iter] == 0)
                {
                    viDu[iter] = -1;
                    viRet.push_back(iter); 
                }
            }
            for(auto iter: viRet)
            {
                setiNode.erase(iter);
                for(auto iter2: vviRelation[iter])
                {
                    viDu[iter2]--;
                }
            }
        }
        return viRet;
    }
};
复制代码

 

运行结果

 

posted @   过客匆匆,沉沉浮浮  阅读(53)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示