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;
}
};