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阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WinForm邮件内容编辑器的简单实现

1、概述 在WinForm开发中&#xff0c;您可能会碰到发送邮件时内容编辑的问题&#xff0c;大部分开发人员第一个想法是希望将 WinForm中的内容编辑器做到和.NET 中类似FCK一样。今天我们就来介绍下如何实现和FCK一样的内容编辑器功能。 2、正文 邮件内容编辑器的问题,在…

LeetCode 1245. 树的直径(图的最大直径结论)

文章目录1. 题目2. 解题1. 题目 求树的最大直径。 2. 解题 类似题目&#xff1a;LeetCode 5538. 统计子树中城市之间最大距离&#xff08;枚举所有可能图的最大直径&#xff09; 结论&#xff1a;求无权无向图中的最长一条路径 先从任意一点P出发&#xff0c;找到离它最远的…

64 位 win7(2008 r2) 使用PLSQL Developer x86 32bit的解决方法

64 位 win7 使用PLSQL Developer 由于 PLSQL Developer 没有64位版本&#xff0c;所以在64位系统上运行该程序会报错&#xff0c;笔者为这个问题纠结了好几天&#xff0c;后来通过请教Google 动手实践&#xff0c;终于搞定了这个问题。现在把笔者解决的过程记录下来&#xff…

python的序列类型包括哪三类,Python常用的序列类型包括列表、元组和字典三种。...

表示M型&#xff0c;常用统中库管理系数据。边际位人的人消费每增增加加1均收均消倾向个单出数入所费支是指&#xff0c;列类边际消费民的年农倾向村居是(。的家品消庭食9年则2居民城镇出为费支&#xff0c;型包庭以3口镇家若城人计算。括列北省的份控股有及额为年国占河企业国…

LeetCode 545. 二叉树的边界(前序+后序)*

文章目录1. 题目2. 解题1. 题目 给定一棵二叉树&#xff0c;以逆时针顺序从根开始返回其边界。 边界按顺序包括左边界、叶子结点和右边界而不包括重复的结点。 (结点的值可能重复) 左边界的定义是从根到最左侧结点的路径。 右边界的定义是从根到最右侧结点的路径。 若根没有左…

centos 7 ssh 安装mysql,Linux服务器远程ssh为centos7安装MySQL

最近为客户选了个云服务器操作系统选择CentOS 7.0 64位通过ssh远程安装MySQL5.6&#xff0c;与大家分享安装过程ssh远程客户端选择的是xshell,感觉比较好用&#xff0c;可以直接通过绑定的xftp进行远程目录的上传下载操作通过xshell先连接远程服务器&#xff0c;指定服务器ip&a…

LeetCode 333. 最大 BST 子树(递归)*

文章目录1. 题目2. 解题1. 题目 给定一个二叉树&#xff0c;找到其中最大的二叉搜索树&#xff08;BST&#xff09;子树&#xff0c; 其中最大指的是子树节点数最多的。 注意: 子树必须包含其所有后代。 示例: 输入: [10,5,15,1,8,null,7]10 / \ 5 15 / \ \ 1 8 7 输…

LeetCode 663. 均匀树划分(树形DP)

文章目录1. 题目2. 解题1. 题目 给定一棵有 n 个结点的二叉树&#xff0c;你的任务是检查是否可以通过去掉树上的一条边将树分成两棵&#xff0c;且这两棵树结点之和相等。 样例 1: 输入: 5/ \10 10/ \2 3 输出: True 解释: 5/ 10和: 1510/ \2 3和: 15样例 2: 输入…

LeetCode 261. 以图判树(全部连通+边数=V-1)

文章目录1. 题目2. 解题1. 题目 给定从 0 到 n-1 标号的 n 个结点&#xff0c;和一个无向边列表&#xff08;每条边以结点对来表示&#xff09;&#xff0c; 请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。 示例 1&#xff1a; 输入: n 5, 边列表 edges …

php实现数字滚动效果,vue如何实现数字滚动增加效果?代码示例

项目中需要做数字滚动增加的效果&#xff0c;一开始很懵&#xff0c;研究了一下原理&#xff0c;发现很简单&#xff0c;贴出来分享一下 ^_^数字滚动组件&#xff1a;0props: {time: {type: Number,default: 2},value: {type: Number,default: 720000}},methods: {numberGrow (…

LeetCode 1061. 按字典序排列最小的等效字符串(并查集)

文章目录1. 题目2. 解题1. 题目 给出长度相同的两个字符串&#xff1a;A 和 B&#xff0c;其中 A[i] 和 B[i] 是一组等价字符。 举个例子&#xff0c;如果 A "abc" 且 B "cde"&#xff0c;那么就有 a c, b d, c e。 等价字符遵循任何等价关系的一般…

LeetCode 366. 寻找二叉树的叶子节点(上下翻转二叉树+BFS)

文章目录1. 题目2. 解题1. 题目 给你一棵二叉树&#xff0c;请按以下要求的顺序收集它的全部节点&#xff1a; 依次从左到右&#xff0c;每次收集并删除所有的叶子节点重复如上过程直到整棵树为空 示例: 输入: [1,2,3,4,5]1/ \2 3/ \ 4 5 输出: [[4,5,3],[2],[1]…

白话地图投影之初识地球

本文是Koala带你进入GIS世界的开篇&#xff0c;Koala打算用简单通俗的语言为大家介绍地图投影&#xff0c;帮助GISer理解地图投影的概念。作为进入GIS世界多年的老鸟&#xff0c;Koala也是在不断的实战中才真正理解和掌握地图投影的奥秘。 我们生活的地球长啥模样&#xff1f; …

欧洲杯2012

----------------------------------------------------------------------------- 欧洲杯2012 ----------------------------------------------------------------------------- 下载地址&#xff1a;http://itunes.apple.com/cn/app/ou-zhou-bei2012/id531622806?mt8 系统要…

LeetCode 245. 最短单词距离 III

文章目录1. 题目2. 解题1. 题目 给定一个单词列表和两个单词 word1 和 word2&#xff0c;返回列表中这两个单词之间的最短距离。 word1 和 word2 是有可能相同的&#xff0c;并且它们将分别表示为列表中两个独立的单词。 示例: 假设 words ["practice", "ma…

LeetCode 484. 寻找排列(找规律+贪心)

文章目录1. 题目2. 解题1. 题目 现在给定一个只由字符 ‘D’ 和 ‘I’ 组成的 秘密签名。 ‘D’ 表示两个数字间的递减关系&#xff0c;‘I’ 表示两个数字间的递增关系。 并且 秘密签名 是由一个特定的整数数组生成的&#xff0c;该数组唯一地包含 1 到 n 中所有不同的数字&a…

LeetCode 651. 4键键盘(DP,Ctrl+CV)

文章目录1. 题目2. 解题1. 题目 假设你有一个特殊的键盘包含下面的按键&#xff1a; Key 1: (A)&#xff1a;在屏幕上打印一个 A。Key 2: (Ctrl-A)&#xff1a;选中整个屏幕。Key 3: (Ctrl-C)&#xff1a;复制选中区域到缓冲区。Key 4: (Ctrl-V)&#xff1a;将缓冲区内容输出…

oracle scn隐藏参数,Oracle隐含参数scn不一致启动

Oracle隐含参数&#xff1a;allow_resetlogs_corruption的使用提示&#xff1a;Oracle的隐含参数只应该在测试环境或者在Oracle Support的支持下使用orOracle隐含参数&#xff1a;allow_resetlogs_corruption的使用提示&#xff1a;Oracle的隐含参数只应该在测试环境或者在Orac…

LeetCode 298. 二叉树最长连续序列(自顶向下)

文章目录1. 题目2. 解题1. 题目 给你一棵指定的二叉树&#xff0c;请你计算它最长连续序列路径的长度。 该路径&#xff0c;可以是从某个初始结点到树中任意结点&#xff0c;通过「父 - 子」关系连接而产生的任意路径。 这个最长连续的路径&#xff0c;必须从父结点到子结点…

LeetCode 159. 至多包含两个不同字符的最长子串(滑动窗口)

文章目录1. 题目2. 解题1. 题目 给定一个字符串 s &#xff0c;找出 至多 包含两个不同字符的最长子串 t &#xff0c;并返回该子串的长度。 示例 1: 输入: "eceba" 输出: 3 解释: t 是 "ece"&#xff0c;长度为3。示例 2: 输入: "ccaabbb" 输…