给定一棵二叉树的根 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
https://leetcode.cn/problems/insufficient-nodes-in-root-to-leaf-paths/description/
思路:
当节点为叶子节点时,节点是否删除取决于 limit 减去着一路所经过的节点(不包含当前叶子节点)的和 A ,若是当前叶子节点的值小于 A,则当前叶子节点需要被删除,反之不用;
当节点为非叶子节点时,节点是否删除取决于 它的孩子结点,只要其孩子结点有一个被保留,父亲结点就不能被删;换句话说,父亲结点被删除当且仅当它的两个孩子结点均被删除,即在原二叉树中,该节点属于 不足节点
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:TreeNode* sufficientSubset(TreeNode* root, int limit) {if(root == nullptr) {return nullptr;}if(root->left == nullptr && root->right == nullptr) {// 当递归到叶子节点后,若是叶子节点的值小于 limit,说明从根节点到该叶子叶子节点中存在不足节点,该叶子节点本身也属于不足节点,需要删除if(root->val < limit) {return nullptr;} else {return root;}}// 当一个结点不是叶子结点的时候,它是否被删除,要看它的孩子结点,只要其孩子结点有一个被保留,父亲结点就不能被删;换句话说,父亲结点被删除当且仅当它的两个孩子结点均被删除,即在原二叉树中,该节点属于 不足节点root->left = sufficientSubset(root->left, limit - root->val);root->right = sufficientSubset(root->right, limit - root->val);// 当 root 节点 的孩子节点都被删除后,说明根节点无法通过 root 节点到达叶子节点,root 节点属于 不足节点,故而删除if(root->left == nullptr && root->right == nullptr) {return nullptr;}// 若是 root 还有孩子节点,则不用删除return root;}};