leetcode 310 题 [medium]
中: 最小高度树
英: Minimum Height Trees
题解
核心:拓扑排序法
时间复杂度:O(n)
空间复杂度:O(n)
/**
* @param {number} n
* @param {number[][]} edges
* @return {number[]}
*/
var findMinHeightTrees = function(n, edges) {
/**
* 拓扑排序法
* 步骤:每次删除所有当前入度为1的结点,直到最后剩下的结点数 <= 2
* 原理:
* 1. 删除入度为1的结点:相当于剪去所有当前的叶节点,最小高度树的层数必然(仅)下降1层
* (1) 所以最小高度树的高度等于(删除次数 + 剩下结点数)(假设只有一个结点时高度为1)
* 2. 最后结点 <= 2
* (1) 最后剩下1个结点:那么该结点为唯一解
* (2) 最后剩下2个结点:以这两个结点为根的树都是最小高度树
* (3) 最后剩下3个结点:那么必然有两个入度为1的结点和一个入度大于1的结点,可再次通过删除所有当前入度为1的结点进而使得树的高度(仅)下降1层
* (4) 最后剩下结点>3,与(3)同理,可以通过剪枝使树高度下降
*
* 时间复杂度:O(n):O(n)(构建入度数组(邻接列表))+ O(n)(循环删除入度为1的结点) => O(2n) => O(n)
* 空间复杂度:O(n):O(2*(n-1))(邻接列表大小,其实就等于edges中的结点个数) => O(n)
*/
// 初始化入度数组(其