Leetcode.1080 根到叶路径上的不足节点

题目链接

Leetcode.1080 根到叶路径上的不足节点 Rating : 1805

题目描述

给你二叉树的根节点 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 ] [1, 5000] [1,5000]
  • − 1 0 5 < = N o d e . v a l < = 1 0 5 -10^5 <= Node.val <= 10^5 105<=Node.val<=105
  • − 1 0 9 < = l i m i t < = 1 0 9 -10^9 <= limit <= 10^9 109<=limit<=109

解法:DFS

根据定义,根节点 到 叶子节点 路径和 s u m < l i m i t sum < limit sum<limit,这条路径上的点就可能是 不足节点

我们定义的 d f s ( r o o t , s u m , l i m i t ) dfs(root,sum,limit) dfs(root,sum,limit) 每次都返回以 r o o t root root 为根节点的子树中是否存在 不足节点

r o o t root root 为根节点:

  • 如果 r o o t root root 的左子树中都是 不足节点,即 d f s ( r o o t − > l e f t , s u m , l i m i t ) = f a l s e dfs(root->left,sum,limit) = false dfs(root>left,sum,limit)=false,那么就删除左子树;
  • 如果 r o o t root root 的右子树中都是 不足节点,即 d f s ( r o o t − > r i g h t , s u m , l i m i t ) = f a l s e dfs(root->right,sum,limit) = false dfs(root>right,sum,limit)=false,那么就删除右子树;
  • r o o t root root 的左子树 和 右子树都是 不足节点,那么 r o o t root root 也被删除;

时间复杂度: O ( n ) O(n) O(n)

C++代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool dfs(TreeNode* root,int sum,int limit){
        if(!root) return false;
        if(!root->left && !root->right){
            return root->val + sum >= limit;
        }

        bool l = dfs(root->left,sum + root->val , limit);
        bool r = dfs(root->right,sum + root->val , limit);

        if(!l) root->left = nullptr;
        if(!r) root->right = nullptr;
        return l || r;
    }
    TreeNode* sufficientSubset(TreeNode* root, int limit) {
        bool ok = dfs(root,0,limit);
        return ok ? root : nullptr;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值