前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang Leetcode 310. Minimum Height Trees.go

Golang Leetcode 310. Minimum Height Trees.go

作者头像
anakinsun
发布2019-04-12 14:00:59
3850
发布2019-04-12 14:00:59
举报
文章被收录于专栏:学习日记学习日记

版权声明:原创勿转 https://cloud.tencent.com/developer/article/1412954

思路

从叶子节点开始不停的向中间收缩。

首先遍历所有的节点,保存对应的入度关系(由于没有方向,所以需要保存两个方向的关系)

然后找到所有的叶子节点(入度等于1的节点)

然后先将叶子节点入队列

剪掉这些叶子节点的后续节点,同时将其中入度为1的节点入队列

当叶子节点少于三个的时候,就是最后的结果

code

代码语言:javascript
复制
func findMinHeightTrees(n int, edges [][]int) []int {
	if n == 1 {
		return []int{0}
	}

	m := make(map[int][]int)
	//建立对应关系
	for _, v := range edges {
		if _, ok := m[v[0]]; ok {
			m[v[0]] = append(m[v[0]], v[1])
		} else {
			m[v[0]] = []int{v[1]}
		}
		if _, ok := m[v[1]]; ok {
			m[v[1]] = append(m[v[1]], v[0])
		} else {
			m[v[1]] = []int{v[0]}
		}
	}
	leaves := []int{}
	//找到所有的叶子节点
	for k, v := range m {
		if len(v) == 1 {
			leaves = append(leaves, k)
		}
	}
	for n > 2 {
		n -= len(leaves)
		one := []int{}
		for _, v := range leaves {
			next := m[v]
			for _, val := range next {
				m[v] = del(m[v], val)
				m[val] = del(m[val], v)
				if len(m[val]) == 1 {
					one = append(one, val)
				}
			}
		}
		leaves = one
	}
	return leaves
}

func del(s []int, v int) []int {
	for key, val := range s {
		if val == v {
			s = append(s[:key], s[key+1:]...)
		}
	}
	return s
}

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年04月07日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思路
  • code
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档