LeetCode解法汇总1080. 根到叶路径上的不足节点

目录链接:

力扣编程题-解法汇总_分享+记录-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;
    }

}

猜你喜欢

转载自blog.csdn.net/AA5279AA/article/details/130804261