来源:力扣(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 重构一棵树的方案数的更多相关文章

  1. Codeforces 509F Progress Monitoring:区间dp【根据遍历顺序求树的方案数】

    题目链接:http://codeforces.com/problemset/problem/509/F 题意: 告诉你遍历一棵树的方法,以及遍历节点的顺序a[i],长度为n. 问你这棵树有多少种可能的 ...

  2. poj3254 Corn Fields 利用状态压缩求方案数;

    Corn Fields 2015-11-25 13:42:33 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10658   ...

  3. 【LeetCode】Symmetric Tree 推断一棵树是否是镜像的

    题目:Symmetric Tree <span style="font-size:18px;"><span style="font-size:18px; ...

  4. [LeetCode]Subtree of Another Tree判断一棵树是不是另一棵树的子树

    将树序列化为字符串,空节点用符号表示,这样可以唯一的表示一棵树. 用list记录所有子树的序列化,和目标树比较. List<String> list = new ArrayList< ...

  5. LeetCode——Same Tree(判断两棵树是否相同)

    问题: Given two binary trees, write a function to check if they are equal or not. Two binary trees are ...

  6. [LeetCode] Same Tree 判断相同树

    Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...

  7. Leetcode 5274. 停在原地的方案数

    纪念第一次正式参加,听说这次题目很水,感觉确实不是很难,一般前两题都很简单,这次,到第三题的时候,都还可以做,emm...... 实际代码记录: #include <iostream> # ...

  8. [LeetCode] 100. Same Tree 相同树

    Given two binary trees, write a function to check if they are the same or not. Two binary trees are ...

  9. 【LeetCode】572. 另一个树的子树 Subtree of Another Tree(Python & Java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:先序遍历 方法二:DFS + DFS 方法三 ...

  10. 小希的迷宫(MST单棵树判断法则)

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

随机推荐

  1. kali2021.4a安装angr(使用virtualenv)

    在Linux中安装各种依赖python的软件时,最头疼的问题之一就是各个软件的python版本不匹配的问题,angr依赖python3,因此考虑使用virtualenv来安装angr Virtuale ...

  2. 体验 Gitea Actions

    即将推出的 Gitea Actions 致力于打造一个 CI/CD 工具的标准协议,第三方 CI 系统可以基于actions 协议与 Gitea 平台集成,提供一站式管理方案.Gitea Action ...

  3. 修改数据时,一直提示"具有 XXX 的 字典管理 已存在(即数据已存在)

    原代码: class DictConfig(models.Model): """ 字典表 """ id = models.AutoField ...

  4. uniapp 微信小程序自己封装头部标题栏

    一.首先要关闭原生导航栏 :在pages.json 中设置  "navigationStyle":"custom" 二.在APP.vue中 onLaunch: ...

  5. Fast RCNN论文阅读笔记

    1.Introduction 1.1 RCNN 和SPPnet RCNN有几个显著的问题:1.训练的时候是多阶段的训练,分别分三个阶段训练卷积层.SVM.边框回归矩阵.2.训练很耗时.3.目标定位非常 ...

  6. 说一下三种jar包在Linux的启动方式

    最近在linux上发布了一个SpringBoot项目,研究了一下jar包在Linux上的集中启动方式,特在此分享一下. 这里默认要启动的jar包为demo-0.0.1-SNAPSHOT.jar 第一种 ...

  7. mysql游标最后一行重复问题

    今天用调用存储过程时发现数据有点问题,和预期不一致 经排查,发现是游标在遍历过程中重复遍历了,或者说是对游标下标的判断有Bug 调试后发现是游标使用方式不正确 应该在循环外先对游标进行一次取值操作,在 ...

  8. solidity 内存(memory) 可变数组的增删改查 操作

    // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; library Array { function push(uint256[] memo ...

  9. 通过Google Cloud Storage(GCS)管理Terraform的状态State

    管理Terraform状态文件的最佳方式是通过云端的统一的存储,如谷歌云就用GCS. 首先要创建一个Bucket: $ gsutil mb -p pkslow -l us-west1 -b on gs ...

  10. [阿里云]Datahub测试使用记录

    由于需要测试阿里云Datahub功能,因此测了一下Datahub的一些功能 DATAHUB: 简介: 阿里云的流式数据(streaming)处理平台 对流式数据的发布(publish)订阅(subsc ...