【LetMeFly】1080.根到叶路径上的不足节点
力扣题目链接:https://leetcode.cn/problems/insufficient-nodes-in-root-to-leaf-paths/
给定一棵二叉树的根 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
方法一:深度优先搜索DFS
首先我们将“limit”理解为“need”,意思为“路径总和还需要need这么多才能不被删除”
接着我们就可以开始递归了。递归函数“dfs(TreeNode* root, int need)”的功能是:
从root到叶节点,是否所有的路径的和都小于need。如果是,则说明root需要被删除,返回“空”;否则,返回删除过左右子节点的root。
具体怎么判断呢?
- 如果root是叶节点,那么就看 n e e d − r o o t . v a l need - root.val need−root.val是否大于 0 0 0。如果大于0,就说明要删掉root节点;否则直接返回root节点。
 - 否则(root不是叶节点),将root的左右子替换成递归后的结果,如果左右子都空,则删掉root;否则返回修改过左右子的root。
 
为了方便,我们也可以直接使用题目中自带的sufficientSubset函数作为dfs函数。
- 时间复杂度 O ( n ) O(n) O(n),其中 n n n是二叉树的节点个数
 - 空间复杂度 O ( n ) O(n) O(n)
 
AC代码
C++
class Solution {
public:
    TreeNode* sufficientSubset(TreeNode* root, long long limit) {
        limit -= root->val;
        if (!root->left && !root->right) {  // 叶节点
            if (limit <= 0) {
                return root;
            }
            else {
                // delete root;
                return nullptr;
            }
        }
        TreeNode* left = root->left ? sufficientSubset(root->left, limit) : nullptr;
        TreeNode* right = root->right ? sufficientSubset(root->right, limit) : nullptr;
        if (!left && !right) {
            // delete root;
            return nullptr;
        }
        else {
            root->left = left;
            root->right = right;
            return root;
        }
    }
};
 
Python
# from typing import Optional
# # Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def sufficientSubset(self, root: Optional[TreeNode], limit: int) -> Optional[TreeNode]:
        limit -= root.val
        if not root.left and not root.right:
            if limit <= 0:
                return root
            else:
                return None
        left = self.sufficientSubset(root.left, limit) if root.left else None
        right = self.sufficientSubset(root.right, limit) if root.right else None
        if not left and not right:
            return None
        else:
            root.left = left
            root.right = right
            return root
 
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/130801361
输入: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]
输入: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]
输入:root = [5,-6,-6], limit = 0
输出:[]


















