赤峰网站建设公司网站开发与制作论文开题
2026/1/1 14:24:41 网站建设 项目流程
赤峰网站建设公司,网站开发与制作论文开题,安徽网站建设整体策划方案,微信商城网站建设视频这个题需要复杂的证明#xff0c;这里不再用数学证明。最小高度树的高度公式设树中距离最远的两个节点为 x, y它们之间的距离为 maxdist dist[x][y]。则任意最小高度树的高度为minheight⌈maxdist​/2⌉换句话说#xff0c;最小高度树的高度是最长路径长度的一半向上取整。最…这个题需要复杂的证明这里不再用数学证明。最小高度树的高度公式设树中距离最远的两个节点为 x, y它们之间的距离为maxdist dist[x][y]。则任意最小高度树的高度为minheight⌈maxdist​/2⌉换句话说最小高度树的高度是最长路径长度的一半向上取整。最小高度树的根节点位置根节点一定在这条最长路径上。如果根不在最长路径上则无论怎么选高度都不可能小于minheight会和最长路径长度矛盾。只是说一说直觉就可以理解的。想象最长路径是一条线根放在中间两边叶子到根的距离最均衡形成最小高度。如果根偏离这条路径则最长的一边会更长高度反而变大。树的高度取决于最远的叶子对。把根放在最远叶子对的中间让两边尽量平衡。就像把跷跷板的支点放在中间重量距离最均衡高度最小。因此我们只需要求出路径最长的两个叶子节点即可并求出其路径的最中间的节点即为最小高度树的根节点。可以利用以下算法找到图中距离最远的两个节点与它们之间的路径以任意节点 p 出现利用广度优先搜索或者深度优先搜索找到以 p 为起点的最长路径的终点 x(树没有环所以从任意节点出发沿着最长的分支走最远的点一定落在最长路径的某个端点上。)以节点 x 出发找到以 x 为起点的最长路径的终点 yx 到 y 之间的路径即为图中的最长路径找到路径的中间节点即为根节点。有了以上前置知识我们使用拓扑排序的方法进行求解不再使用深度搜素和广度搜索的方法class Solution { public: vectorint findMinHeightTrees(int n, vectorvectorint edges) { if(n1) return {0}; //创建邻接矩阵 vectorunordered_setint graphs(n); for(auto e:edges){ graphs[e[0]].insert(e[1]); graphs[e[1]].insert(e[0]); } vectorint leves; //找叶子节点 for(int i 0;in;i){ if(graphs[i].size()1) leves.push_back(i); } // 删结点 int remainingn; while(remaining2){ remaining-leves.size(); vectorint newleves; //删边 for(auto e:leves){ int ajx*(graphs[e].begin()); graphs[ajx].erase(e); if(graphs[ajx].size()1) newleves.push_back(ajx); } levesnewleves; } return leves; } };思路总结树的最小高度树的根一定在最长路径的中间 → 对应最终剩下 1 或 2 个节点。用剥叶子法反复删除所有叶子节点度 1剩下的节点就是最小高度树的根时间复杂度 O(n)空间复杂度 O(n)。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询