题目链接
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;
}
};