【LeetCode - 每日一题】1080. 根到叶路径上的不足节点 (2023.05.22)

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

题意

  • 不足节点:若所有通过该节点 node 的“根 - 叶”路径上值的总和都小于 limit ,则 node 为不足节点。
  • “根 - 叶”,路径必须到叶子结点

解法 dfs

对于一个非叶节点 node

  • 若以 node 为根的子树的所有叶子节点都是不足节点,则 node 也是不足节点;
  • 若以 node 为根的子树的叶子结点有一个不是不足节点,则 node 也不是不足节点;

由于涉及到 删除节点 的操作,所以在每次递归判断节点 node 时,处理其左右孩子,而非处理 node

由于叶子结点也可以作为根,所以将叶子节点的孩子初始化为 false

ATTENTION:

  • 将指针作为形参,子函数 会修改 指针指向的存储空间的值。
/**
 * 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 judge(TreeNode* root, int limit, int maxSum)   // 判断当前节点的子树里有没有叶子节点为不足节点
    {   
        // 叶子节点的孩子,初始化为 false
        if(root == nullptr) return false;

        // 叶子节点
        if(root->left == nullptr && root->right == nullptr)
        {
            return (root->val + maxSum) >= limit;
        }
        
        // 非叶节点,判断以其左右孩子为根的子树中有没有叶子节点为不足节点
        bool flagLeft = judge(root->left, limit, maxSum + root->val);
        bool flagRight = judge(root->right, limit, maxSum + root->val);
        if(flagLeft == false) root->left = nullptr;
        if(flagRight == false) root->right = nullptr;
        return flagLeft || flagRight;
    }
    TreeNode* sufficientSubset(TreeNode* root, int limit) {
        // TreeNode* ans = root;
        if(judge(root, limit, 0) == false) return nullptr;
        else return root;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值