目录链接:
力扣编程题-解法汇总_分享+记录-CSDN博客
GitHub同步刷题项目:
https://github.com/September26/java-algorithms
原题链接:力扣
描述:
给你二叉树的根节点 root
和一个整数 limit
,请你同时删除树中所有 不足节点 ,并返回最终二叉树的根节点。
假如通过节点 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 = [1,2,-3,-5,null,4,null], limit = -1 输出:[1,null,-3,4]
提示:
- 树中节点数目在范围
[1, 5000]
内 -105 <= Node.val <= 105
-109 <= limit <= 109
解题思路:
* 解题思路: * 构建一个递归方法,返回值为是否删除当前节点。 * 方法中,判断如果是叶子节点,则根据(sum + node.val) < limit;判断是否需要删除当前路径的节点,并返回。 * 如果左节点不为空,则进入递归方法,查看左节点是否可以删除。右节点也是一样的逻辑。 * 如果左右节点有一个是不可删除的,则当前节点就是不可删除的。
代码:
public class Solution1080 {
public TreeNode sufficientSubset(TreeNode root, int limit) {
return search(root, limit, 0) ? null : root;
}
/**
* @return true代表存在,false代表不存在
*/
private boolean search(TreeNode node, int limit, int sum) {
if (node.right == null && node.left == null) {
return (sum + node.val) < limit;
}
boolean isDelete = true;
if (node.left != null) {
if (search(node.left, limit, sum + node.val)) {
node.left = null;
} else {
isDelete = false;
}
}
if (node.right != null) {
if (search(node.right, limit, sum + node.val)) {
node.right = null;
} else {
isDelete = false;
}
}
return isDelete;
}
}