LeetCode-1719 重构一棵树的方案数
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-ways-to-reconstruct-a-tree
题目描述
给你一个数组 pairs ,其中 pairs[i] = [xi, yi] ,并且满足:
pairs 中没有重复元素
xi < yi
令 ways 为满足下面条件的有根树的方案数:
树所包含的所有节点值都在 pairs 中。
一个数对 [xi, yi] 出现在 pairs 中 当且仅当 xi 是 yi 的祖先或者 yi 是 xi 的祖先。
注意:构造出来的树不一定是二叉树。
两棵树被视为不同的方案当存在至少一个节点在两棵树中有不同的父节点。
请你返回:
如果 ways == 0 ,返回 0 。
如果 ways == 1 ,返回 1 。
如果 ways > 1 ,返回 2 。
一棵 有根树 指的是只有一个根节点的树,所有边都是从根往外的方向。
我们称从根到一个节点路径上的任意一个节点(除去节点本身)都是该节点的 祖先 。根节点没有祖先。
示例 1:

输入:pairs = [[1,2],[2,3]]
输出:1
解释:如上图所示,有且只有一个符合规定的有根树。
示例 2:

输入:pairs = [[1,2],[2,3],[1,3]]
输出:2
解释:有多个符合规定的有根树,其中三个如上图所示。
示例 3:
输入:pairs = [[1,2],[2,3],[2,4],[1,5]]
输出:0
解释:没有符合规定的有根树。
提示:
1 <= pairs.length <= 105
1 <= xi < yi <= 500
pairs 中的元素互不相同。
解题思路
这道题确实很难。光是思路就十分难想。
首先,如果是一棵树,那么他肯定有一个根结点,并且这个根结点与其他结点的连接数应该是n-1 所以,我们可以统计所有结点的连接数,如果没有n-1的结点,那么可以判断无法构成一棵树。
已知如果一个结点是某些结点的祖先,那么其父节点也是这些结点的祖先。所以我们依次判断结点的父结点连接的结点是否全部包含该结点所连接的结点。
寻找父节点的方法是寻找该结点中,结点连接数最小的并且连接数大于等于该结点的连接数的结点,则这个结点就是该结点的父结点。同时,如果一个结点与其父节点连接数相同,那么他们可以互相交换,这种情况发生就表示构成的树种类大于1。
代码展示
class Solution {
public:
    int checkWays(vector<vector<int>>& pairs) {
        unordered_map<int, unordered_set<int>> mapisetAdj;//degree 等于set的大小
        int iRoot = 0, iN = 0, iRet = 1;
        for(auto iter: pairs)
        {
            mapisetAdj[iter[0]].emplace(iter[1]);
            mapisetAdj[iter[1]].emplace(iter[0]);
        }
        iN = mapisetAdj.size();
        for(auto iter: mapisetAdj)
        {
            if(iter.second.size() == iN - 1)
            {
                iRoot = iter.first;
            }
        }
        if(!iRoot)
            return 0;
        for(auto iter: mapisetAdj)
        {
            if(iter.first == iRoot)
                continue;
            int iParent = 0, iParentDegree = INT_MAX;
            for(auto iter2: iter.second)
            {
                if(iParentDegree > mapisetAdj[iter2].size() && mapisetAdj[iter2].size() >= iter.second.size())
                {
                    iParent = iter2;
                    iParentDegree = mapisetAdj[iter2].size();
                }
            }
            if(!iParent)
                return 0;
            for(auto iter2: iter.second)
            {
                if (iter2 == iParent)
                    continue;
                if(!mapisetAdj[iParent].count(iter2))
                    return 0;
            }
            if(iParentDegree == iter.second.size())
            {
                iRet = 2;
            }
        }
        return iRet;
    }
};
运行结果

LeetCode-1719 重构一棵树的方案数的更多相关文章
- Codeforces 509F Progress Monitoring:区间dp【根据遍历顺序求树的方案数】
		题目链接:http://codeforces.com/problemset/problem/509/F 题意: 告诉你遍历一棵树的方法,以及遍历节点的顺序a[i],长度为n. 问你这棵树有多少种可能的 ... 
- poj3254 Corn Fields 利用状态压缩求方案数;
		Corn Fields 2015-11-25 13:42:33 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10658 ... 
- 【LeetCode】Symmetric Tree 推断一棵树是否是镜像的
		题目:Symmetric Tree <span style="font-size:18px;"><span style="font-size:18px; ... 
- [LeetCode]Subtree of Another Tree判断一棵树是不是另一棵树的子树
		将树序列化为字符串,空节点用符号表示,这样可以唯一的表示一棵树. 用list记录所有子树的序列化,和目标树比较. List<String> list = new ArrayList< ... 
- LeetCode——Same Tree(判断两棵树是否相同)
		问题: Given two binary trees, write a function to check if they are equal or not. Two binary trees are ... 
- [LeetCode] Same Tree 判断相同树
		Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ... 
- Leetcode 5274. 停在原地的方案数
		纪念第一次正式参加,听说这次题目很水,感觉确实不是很难,一般前两题都很简单,这次,到第三题的时候,都还可以做,emm...... 实际代码记录: #include <iostream> # ... 
- [LeetCode] 100. Same Tree 相同树
		Given two binary trees, write a function to check if they are the same or not. Two binary trees are ... 
- 【LeetCode】572. 另一个树的子树 Subtree of Another Tree(Python & Java)
		作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:先序遍历 方法二:DFS + DFS 方法三 ... 
- 小希的迷宫(MST单棵树判断法则)
		小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ... 
随机推荐
- 浏览器内存漫游解决方案(js逆向)
			//浏览器内存漫游解决方案(js逆向) //原理通过ast把所有的变量,参数中间值进行内存的存储 //搜索AST-hook,进入github //现在github的库下载下来 //anyproxy n ... 
- TCP协议三握四挥、socket模块
			目录 传输层之TCP与UDP协议 应用层 socket模块 socket代码简介 代码优化 半连接池的概念 传输层之TCP与UDP协议 用于应用程序之间的通信 TCP与UDP都是用来规定通信方式的  ... 
- java中的自增运算
			本文主要阐明java中的自增运算 1.当i ++ 与 ++ i作为单独语句时,作用与i = i +1一样 2.当赋值时,结果就不一样了 temp = i ++: 操作顺序:1)temp = i: 2) ... 
- 学习.NET MAUI Blazor(一)、Blazor是个啥?
			先把Blazor放一边,先来看看目前Web开发的技术栈. 注:上图只是为了说明问题,没有任何语言歧视! 这是目前最常用的前后端分离开发模式,这个开发模式需要配备前端工程师和后端工程师.当然了,全栈工程 ... 
- MasaFramework -- i18n (国际化)
			概念 作为一个普通开发者, 我们负责的项目的使用群体大多数是本国的人民, 但不可避免的也有一些做外贸的业务或者给外企做的项目, 这个时候就要求我们的项目有服务全球客户的能力, 而一个支持国际化能力的框 ... 
- [OpenCV实战]22 使用EigenFaces进行人脸重建
			目录 1 背景 1.1 什么是EigenFaces? 1.2 坐标的变化 2 面部重建 2.1 计算新面部图像的PCA权重 2.2 使用EigenFaces进行面部重建 3 参考 在这篇文章中,我们将 ... 
- jjq(友链:https://tg.hszxoj.com/user/475)
			
- 浅谈浏览器端 WebGIS 开发可能会用到的、提升效率的 js 库
			目录 前置说明 1. 与数据格式转换解析相关 1.1. 解析和转换 WKT 几何数据 1.2. 前端直接读取 GeoPackage - @ngageoint/geopackage 1.3. 前端直接读 ... 
- java画海报
			package demotest; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; impor ... 
- Gateway服务网关 (入门到使用)
			Gateway服务网关 Gateway也要作为微服务注册到nacos中 Zuul也是网关但比较老是一种阻塞式编程:Spring Cloud Gateway 是 Spring Cloud 的一个全新项目 ... 
