LeetCode 1273. 删除树节点(拓扑排序/DFS)
文章目录
- 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)相关推荐
- java 有向无环图 树_拓扑排序-有向无环图(DAG, Directed Acyclic Graph)
条件: 1.每个顶点出现且只出现一次. 2.若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面. 有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说. 一 ...
- zTree实现删除树节点
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! zTre ...
- [Leetcode][第207题][JAVA][课程表][拓扑排序][DFS]
[问题描述][中等] [解答思路] 1. 拓扑排序 复杂度分析 HashSet[] 数组 import java.util.HashSet; import java.util.LinkedList; ...
- python 拓扑排序 dfs bfs_图遍历算法之DFS/BFS
在计算机科学, 图遍历(Tree Traversal,也称图搜索)是一系列图搜索的算法, 是单次访问树结构类型数据(tree data structure)中每个节点以便检查或更新的一系列机制.图遍历 ...
- python 拓扑排序 dfs bfs_bfs与dfs的优缺点?
刚好今天作业有道题问了相似问题= =,顺便来回答一下 DFS和BFS主要差别在于BFS遍历方式是围绕着根结点一圈一圈(level by level)向外遍历,借助队列的方式实现,而DFS的方式则是从一 ...
- LeetCode 210. 课程表 II(拓扑排序)
1. 题目 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课 ...
- LeetCode MySQL 608. 树节点
文章目录 1. 题目 2. 解题 1. 题目 给定一个表 tree,id 是树节点的编号, p_id 是它父节点的 id . +----+------+ | id | p_id | +----+--- ...
- LeetCode 269. 火星词典(拓扑排序)
文章目录 1. 题目 2. 解题 1. 题目 现有一种使用字母的全新语言,这门语言的字母顺序与英语顺序不同. 假设,您并不知道其中字母之间的先后顺序. 但是,会收到词典中获得一个 不为空的 单词列表. ...
- 14.2 拓扑排序DFS算法
文章目录 原理 Python代码 测试数据 原理 三色标记DFS天然适合拓扑排序.因为三色标记DFS是先查看栈顶元素,如果不是黑色,说明子元素(邻居)还没压栈.这个时候再将子元素压入栈,后续出栈的 ...
最新文章
- python如何收集数据_用Python做数据清洗:采集几百个xls或csv中的数据并汇总
- 20181104_C#线程之Thread_ThreadPool_使用Thread实现回到和带参数的回调
- 大数据量的存储分表常见算法
- 227 Puzzle
- linux搭建博客day2
- linux mysql tomcat_Linux下安装Tomcat,Linux下安装Mysql
- CASS9.1计算土方量实例
- struts2与json的整合
- OpenJDK8在LINUX上,输入法候选框无法正确定位
- 《程序员的自我修养》读书笔记 第十周
- NumPy常用中文手册
- 高效办公软件推荐——文件搜索类
- 将图片从AutoCAD导出到Word
- 优车车欲用Uber模式和传统驾校一起打一场漂亮仗
- 计算机组成原理 罗克露 pdf,罗克露计算机组成原理课件(一).pdf
- lora 网关 linux,什么是LoRa网关 如何选择一个好的LoRaWAN网关
- 正规手游代理该怎么选?
- android win7 共享网络打印机,详解win7共享打印机如何设置
- 【财务分析】ERP软件的财务管理系统具有哪些功能?
- Python处理PDF神器:PyMuPDF的安装与使用