文章目录

  • 1. 题目
  • 2. 解题
    • 2.1 取巧解
    • 2.2 拓扑排序
    • 2.3 建图+DFS

1. 题目

给你一棵以节点 0 为根节点的树,定义如下:

节点的总数为 nodes 个;
第 i 个节点的值为 value[i] ;
第 i 个节点的父节点是 parent[i] 。
请你删除节点值之和为 0 的每一棵子树。

在完成所有删除之后,返回树中剩余节点的数目。

示例:

输入:nodes = 7,
parent = [-1,0,0,1,2,2,2],
value = [1,-2,4,0,-2,-1,-1]
输出:2提示:
1 <= nodes <= 10^4
-10^5 <= value[i] <= 10^5
parent.length == nodes
parent[0] == -1 表示节点 0 是树的根。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/delete-tree-nodes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 取巧解

  • 数据很特殊,数据尾部为更深的节点,逆序遍历即是自底向上
  • 该解法不通用
class Solution {public:int deleteTreeNodes(int nodes, vector<int>& parent, vector<int>& value) {int i, n = parent.size();vector<int> count(n,1);for(i = n-1; i >= 0; --i){if(value[i]==0)count[i] = 0;//自己子树和为0,删除节点if(parent[i] != -1){value[parent[i]] += value[i];//值加给父节点count[parent[i]] += count[i];//父节点底下不为0的节点个数}}return count[0];}
};

60 ms 21.1 MB

2.2 拓扑排序

class Solution {public:int deleteTreeNodes(int nodes, vector<int>& parent, vector<int>& value) {int i, n = parent.size();vector<int> indegree(n,0);for(i = 0; i < n; ++i)if(parent[i] != -1)indegree[parent[i]]++;queue<int> q;for(i = 0; i < n; ++i)if(indegree[i] == 0)q.push(i);vector<int> count(n,1);while(!q.empty()){int tp = q.front();q.pop();if(value[tp]==0)count[tp] = 0;if(parent[tp] == -1)continue;if(--indegree[parent[tp]]==0)q.push(parent[tp]);value[parent[tp]] += value[tp];count[parent[tp]] += count[tp];}return count[0];}
};

88 ms 22.2 MB

2.3 建图+DFS

class Solution {vector<vector<int>> edges;vector<int> count;
public:int deleteTreeNodes(int nodes, vector<int>& parent, vector<int>& value) {int i, n = parent.size();edges.resize(n);count = vector<int>(n,1);for(i = 0; i < n; ++i)if(parent[i] != -1)edges[parent[i]].push_back(i);dfs(0, parent, value);return count[0];}void dfs(int id, vector<int>& parent, vector<int>& value){for(int next : edges[id]){dfs(next, parent, value);}if(value[id]==0)count[id] = 0;if(parent[id] != -1){value[parent[id]] += value[id];count[parent[id]] += count[id];}}
};

96 ms 29.4 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 1273. 删除树节点(拓扑排序/DFS)相关推荐

  1. java 有向无环图 树_拓扑排序-有向无环图(DAG, Directed Acyclic Graph)

    条件: 1.每个顶点出现且只出现一次. 2.若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面. 有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说. 一 ...

  2. zTree实现删除树节点

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! zTre ...

  3. [Leetcode][第207题][JAVA][课程表][拓扑排序][DFS]

    [问题描述][中等] [解答思路] 1. 拓扑排序 复杂度分析 HashSet[] 数组 import java.util.HashSet; import java.util.LinkedList; ...

  4. python 拓扑排序 dfs bfs_图遍历算法之DFS/BFS

    在计算机科学, 图遍历(Tree Traversal,也称图搜索)是一系列图搜索的算法, 是单次访问树结构类型数据(tree data structure)中每个节点以便检查或更新的一系列机制.图遍历 ...

  5. python 拓扑排序 dfs bfs_bfs与dfs的优缺点?

    刚好今天作业有道题问了相似问题= =,顺便来回答一下 DFS和BFS主要差别在于BFS遍历方式是围绕着根结点一圈一圈(level by level)向外遍历,借助队列的方式实现,而DFS的方式则是从一 ...

  6. LeetCode 210. 课程表 II(拓扑排序)

    1. 题目 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课 ...

  7. LeetCode MySQL 608. 树节点

    文章目录 1. 题目 2. 解题 1. 题目 给定一个表 tree,id 是树节点的编号, p_id 是它父节点的 id . +----+------+ | id | p_id | +----+--- ...

  8. LeetCode 269. 火星词典(拓扑排序)

    文章目录 1. 题目 2. 解题 1. 题目 现有一种使用字母的全新语言,这门语言的字母顺序与英语顺序不同. 假设,您并不知道其中字母之间的先后顺序. 但是,会收到词典中获得一个 不为空的 单词列表. ...

  9. 14.2 拓扑排序DFS算法

    文章目录 原理 Python代码 测试数据 原理   三色标记DFS天然适合拓扑排序.因为三色标记DFS是先查看栈顶元素,如果不是黑色,说明子元素(邻居)还没压栈.这个时候再将子元素压入栈,后续出栈的 ...

最新文章

  1. python如何收集数据_用Python做数据清洗:采集几百个xls或csv中的数据并汇总
  2. 20181104_C#线程之Thread_ThreadPool_使用Thread实现回到和带参数的回调
  3. 大数据量的存储分表常见算法
  4. 227 Puzzle
  5. linux搭建博客day2
  6. linux mysql tomcat_Linux下安装Tomcat,Linux下安装Mysql
  7. CASS9.1计算土方量实例
  8. struts2与json的整合
  9. OpenJDK8在LINUX上,输入法候选框无法正确定位
  10. 《程序员的自我修养》读书笔记 第十周
  11. NumPy常用中文手册
  12. 高效办公软件推荐——文件搜索类
  13. 将图片从AutoCAD导出到Word
  14. 优车车欲用Uber模式和传统驾校一起打一场漂亮仗
  15. 计算机组成原理 罗克露 pdf,罗克露计算机组成原理课件(一).pdf
  16. lora 网关 linux,什么是LoRa网关 如何选择一个好的LoRaWAN网关
  17. 正规手游代理该怎么选?
  18. android win7 共享网络打印机,详解win7共享打印机如何设置
  19. 【财务分析】ERP软件的财务管理系统具有哪些功能?
  20. Python处理PDF神器:PyMuPDF的安装与使用

热门文章

  1. ]数据结构:单链表之判断两个链表是否相交及求交点(带环、不带环)
  2. uboot中关于LCD的代码分析
  3. C++远航之封装篇——构造函数
  4. 前端小插件之手写js循环滚动特效
  5. Python--day 3
  6. java学习笔记IO之字节输入输出流
  7. YAML/Properties配置文件与Spring Boot(转)
  8. ABP框架详解(八)动态ApiController的生成和访问机制
  9. loadView加载(变换成ScrollView)
  10. 【原创】软件测试工程师基础技能+