博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode]310. Minimum Height Trees
阅读量:6552 次
发布时间:2019-06-24

本文共 2320 字,大约阅读时间需要 7 分钟。

解法一:http://siukwan.sinaapp.com/?p=189    https://www.cnblogs.com/TonyYPZhang/p/5123058.html

1.这道题目主要是求一个无向图中,以哪个节点为根节点的树的高度最小;

2.常规方法可以使用BFS或者DFS,对每个点都遍历一遍,求出所有点组成的树的高度,然后找出哪些高度最小的节点,可以通过不断更新最低高度来进行剪枝。实际上我写了BFS和DFS的程序,均出现超时。

3.最终的解题思路采用了不断删除叶子节点,逐渐逼近根节点的方法,在删除叶子节点的同时,会有一些新的节点成为叶子节点,于是继续循环删除,直至不能删除为止,那么剩下的节点就是高度最小的根。

4.当n等于1时,需要特殊处理,直接返回{0}。

5.最终会剩下1个节点或者2个节点,1个节点的情况比较好理解,如{0,1}{0,2},同时删除了叶子节点1和2,就剩下0;而两个节点的情况为{0,1},此时0和1的邻居均为1,都是叶子节点,在下一轮操作后,0和1均没有邻居,所以这两个节点都是正确的答class Solution public:

struct TreeNode{        set
list;//使用set结构方便删除邻居 TreeNode(){}; bool isLeaf(){
return list.size()==1;};//这边的分号不能丢 };//这个分号也不能丢 vector
findMinHeightTrees(int n, vector
>& edges) { if(n==1) return {
0}; //使用节点来存储这棵树,耗费的空间为O(n+2e) vector
tree(n); for(auto edge:edges){ tree[edge.first].list.insert(edge.second); tree[edge.second].list.insert(edge.first); } vector
node1(0),node2(0);//node1记录当前的叶子节点、node2记录删除node1叶子节点后,成为新的叶子节点的节点 for(int i=0;i

 

另外一种代码:指针得稍微理解一下

class Solution {public:    class TNode{        public:        int val;        unordered_set
neighbours; TNode(int val):val(val){}; bool isLeaf(){
return neighbours.size()==1;}; };//加分号 vector
findMinHeightTrees(int n, vector
>& edges) { map
val_nodes; for(int i=0;i
neighbours.insert(val_nodes[edge.second]); val_nodes[edge.second]->neighbours.insert(val_nodes[edge.first]); } while(val_nodes.size()>2){ list
listq; for(auto it=val_nodes.begin();it!=val_nodes.end();it++){ if(it->second->isLeaf()) listq.push_back(it->second); } for(auto it=listq.begin();it!=listq.end();it++){ TNode* p= *(*it)->neighbours.begin();//it是list的指针,所以要用(*it)转为TNode p->neighbours.erase(*it); (*it)->neighbours.erase(p); val_nodes.erase((*it)->val); } } vector
res; for(auto it=val_nodes.begin();it!=val_nodes.end();it++){ res.push_back(it->first); } return res; }};
View Code

 

转载于:https://www.cnblogs.com/bright-mark/p/9620531.html

你可能感兴趣的文章
实战开发一个Nginx扩展 (Nginx Module)
查看>>
在Linux上配置unixODBC和FreeTDS访问MS SQL Server
查看>>
Windows 7 32 上 selenium 2+sikuli解决swfupload类型上传插件
查看>>
Spring boot学习二
查看>>
android4.1.1 Settings WIFI模块浅析
查看>>
bi business inteligence
查看>>
php 和redis
查看>>
计算机代数系统(free!GPL)Yacas
查看>>
Spring系列之-Spring IOC容器设计:依赖注入设计
查看>>
360安全浏览器中iframe顶部会产生多余空白
查看>>
mysql sql php 参数化查询
查看>>
canal源码分析——DirectLogFetcher源码分析
查看>>
Thrift0.9.2 安装
查看>>
基于 Tile 连接 Row-Store 和 Column-Store
查看>>
新办公环境之浏览器上不了网
查看>>
只要有基础的access_token和用户openid就可以判断用户是否关注该公众号
查看>>
oracle备份
查看>>
linux 下tr命令
查看>>
Remove Element
查看>>
LNMP架构之访问日志、日志切割、静态文件不记录及过期时间设置
查看>>