Leetcode之深度优先搜索(DFS)专题-1080. 根到叶路径上的不足节点(Insufficient Nodes in Root to Leaf Paths)
Leetcode之深度优先搜索(DFS)专题-1080. 根到叶路径上的不足节点(Insufficient Nodes in Root to Leaf Paths)
这篇是DFS专题的第一篇,所以我会写下具体的解题步骤和过程,以及我当时的思路,有改进的地方,希望指正,共同进步。
给定一棵二叉树的根 root
,请你考虑它所有 从根到叶的路径:从根到任何叶的路径。(所谓一个叶子节点,就是一个没有子节点的节点)
假如通过节点 node
的每种可能的 “根-叶” 路径上值的总和全都小于给定的 limit
,则该节点被称之为「不足节点」,需要被删除。
请你删除所有不足节点,并返回生成的二叉树的根。
示例 1:
输入:root = [1,2,3,4,-99,-99,7,8,9,-99,-99,12,13,-99,14], limit = 1
输出:[1,2,3,4,null,null,7,8,9,null,14]
示例 2:
输入:root = [5,4,8,11,null,17,4,7,1,null,null,5,3], limit = 22
输出:[5,4,8,11,null,17,4,7,null,null,null,5]
示例 3:
输入:root = [5,-6,-6], limit = 0
输出:[]
提示:
- 给定的树有
1
到5000
个节点 -10^5 <= node.val <= 10^5
-10^9 <= limit <= 10^9
分析:
1、首先我们要确定如何删除(即删除的规则):
读题,大概知道大意后,由于题意不是很清晰,我们观察样例。
在观察了样例1后,我大致得出结论,从根-叶子节点的这一段路程里,最后的和如果小于limit,这个叶子节点就要被删除。
同时,很重要一点的是,当一个节点变成叶子节点后,它也应该被删除。(观察样例1中左边的三个-99被删除的情况)
此时,对推断还不是很确信,再观察样例2和样例3,确定推断。
观察样例3时发现,当根节点失去左右儿子的时候,它自己也同时删除,那么只用返回一个null就行了。
2、DFS函数,确定参数个数和各个参数
很明显,我们这题需要去遍历一个树,当到达叶子节点时,检查sum值是否小于limit,如果小于,我们要执行删除这个过程。
此时,删除这个过程,我们通知它的父节点,与他断开连接。
那我们则需要给父节点返回一个消息,告诉父节点,需要删除与之的连接。
所以,我们确定了返回类型为boolean,返回true为需要删除,返回false为保留。
参数方面,传入一个TreeNode,一个limit值,和一个sum用于存储现在的和。
3、编写dfs函数
在dfs函数中,我们有两个变量,我把它命名为leftDeleted和rightDeleted,分别代表左节点和右节点是否删除,true表示没有左(右)儿子节点。
同时,遍历一个树的方法有:1、先序遍历 2、中序 3、后序
我们在这题中,需要得知左右儿子节点的 有无 之后,才能执行删除操作,然后再告诉这个节点的上级,它是否要被删除。
举个例子:
节点1有 左儿子(称为节点2),没有右儿子。
节点2分别有左右儿子。
在这个过程中,节点2的左右儿子被删除,那么节点2变成了叶子节点,节点2也应该被删除,
所以节点2需要返回true给节点1,告诉节点1要删除与之的连接。
AC代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode sufficientSubset(TreeNode root, int limit) {
if(root==null) return root;
dfs(root,limit,0);
if(root.left == null && root.right == null){
return null;
}
return root;
} public boolean dfs(TreeNode root,int limit,int now){
if(root.left==null && root.right==null){
if((now+root.val)<limit) return true;
else return false;
}
boolean leftDeleted = false;
boolean rightDeleted = false;
if(root.left!=null){
if(dfs(root.left,limit,now+root.val)){
root.left = null;
leftDeleted = true;
}
}else leftDeleted = true;
if(root.right!=null){
if(dfs(root.right,limit,now+root.val)){
root.right = null;
rightDeleted = true;
}
}else rightDeleted = true; if(rightDeleted && leftDeleted){
return true;
}
return false;
} }
Leetcode之深度优先搜索(DFS)专题-1080. 根到叶路径上的不足节点(Insufficient Nodes in Root to Leaf Paths)的更多相关文章
- 【leetcode】1080. Insufficient Nodes in Root to Leaf Paths
题目如下: Given the root of a binary tree, consider all root to leaf paths: paths from the root to any l ...
- Leetcode之深度优先搜索&回溯专题-491. 递增子序列(Increasing Subsequences)
Leetcode之深度优先搜索&回溯专题-491. 递增子序列(Increasing Subsequences) 深度优先搜索的解题详细介绍,点击 给定一个整型数组, 你的任务是找到所有该数组 ...
- Leetcode之深度优先搜索&回溯专题-980. 不同路径 III(Unique Paths III)
Leetcode之深度优先搜索&回溯专题-980. 不同路径 III(Unique Paths III) 深度优先搜索的解题详细介绍,点击 在二维网格 grid 上,有 4 种类型的方格: 1 ...
- Leetcode之深度优先搜索&回溯专题-679. 24 点游戏(24 Game)
Leetcode之深度优先搜索&回溯专题-679. 24 点游戏(24 Game) 深度优先搜索的解题详细介绍,点击 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+, ...
- Leetcode之深度优先搜索&回溯专题-638. 大礼包(Shopping Offers)
Leetcode之深度优先搜索&回溯专题-638. 大礼包(Shopping Offers) 深度优先搜索的解题详细介绍,点击 在LeetCode商店中, 有许多在售的物品. 然而,也有一些大 ...
- 深度优先搜索(DFS)专题讲座PPT截图【需要原稿的请留言或私信】
以下是今晚我在bilibili直播讲DFS算法的时候的ppt截图,ppt搞了一下午,水平有限,只能做成这个样子,供大家参考!(如果需要原稿,请在评论区留言或私信告诉我,我会发到你的邮箱里),感谢各位的 ...
- 算法与数据结构基础 - 深度优先搜索(DFS)
DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...
- Leetcode之深度优先搜索(DFS)专题-129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers)
Leetcode之深度优先搜索(DFS)专题-129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers) 深度优先搜索的解题详细介绍,点击 给定一个二叉树,它的每个结点都存放 ...
- Leetcode之深度优先搜索(DFS)专题-559. N叉树的最大深度(Maximum Depth of N-ary Tree)
Leetcode之深度优先搜索(DFS)专题-559. N叉树的最大深度(Maximum Depth of N-ary Tree) 深度优先搜索的解题详细介绍,点击 给定一个 N 叉树,找到其最大深度 ...
随机推荐
- 如何在Eclipse中查看Java类库的源代码
你的JDK安装目录下%Java_home%/src.zip文件就是源码,解压缩找到对应包下面的类即可. 如果是Eclipse开发,ctr+鼠标左击,出现不了源码的话,在弹出的视图中点击attach s ...
- 【杂谈】Hash表与平衡树
hash表与平衡树查询数据的时间复杂度是多少? hash表为O(1),平衡树为O(logn) 这个时间复杂度是如何得出的? 时间复杂度是按照最糟糕的情况来的.但即使是最糟糕的情况,hash表也只需要计 ...
- mybatis动态插入数据库
<insert id="dynamicAddUser"> insert into t_user <!-- trim 对所有的表中列名 进行动态处理 --> ...
- 工作笔记--对接三方Http接口遇到的问题
在使用 HttpClient 4.4 调用第三方 http api 时遇到了很多问题,还好最后都解决了,记录一下遇到的问题及解决办法,希望对同样有此问题的你有所帮助. 环境说明 首先说明一点是,对方的 ...
- 【Android】drawable VS mipmap
Android Studio 创建工程后默认的资源文件夹如下图所示: 一直有些疑惑的是 mipmap 和 drawable 文件夹有什么区别,以及是否还需要创建 drawable-xhdpi, dra ...
- Spark 系列(三)—— 弹性式数据集RDDs
一.RDD简介 RDD 全称为 Resilient Distributed Datasets,是 Spark 最基本的数据抽象,它是只读的.分区记录的集合,支持并行操作,可以由外部数据集或其他 RDD ...
- Qt基于sqlite数据库的管理小软件
闲来无事,写了一个基于sqlite的数据库管理小软件. 先上图 中心思想就是: 创建一个数据库 然后每一个分组对应一个数据表 然后遍历该数据表.将名字以treewidgetItem显示出来.添加删除实 ...
- ccf 201809-4 再卖菜
这题一开始不知道剪枝这种操作,只会傻傻地dfs. 然后dfs递归写80分超时,非递归写70分超时(纳尼?我一直以为非递归算法在时间上会更优秀一些,为什么会这样?!!) 剪一下枝就都能过了 #inclu ...
- F#周报2019年第32期
新闻 推出FSharp.Core 4.7,附带netstandard2支持 ML.NET 1.3.1发布 FSharp.SystemTextJson宣告:对于.NET Core的System.Text ...
- Mybatis的工作流程
MyBatis工作流程 1:加载配置文件(mybatis-config.xml . *...Mapper.xml)并初始化, 将SQL的配置信息加载成为一个个MappedStatement对象(包括了 ...