# 题目描述

给你二叉树的根节点 root 和一个整数 limit ,请你同时删除树中所有** 不足节点 **,并返回最终二叉树的根节点。

假如通过节点node 的每种可能的 “根-叶” 路径上值的总和全都小于给定的 limit,则该节点被称之为 不足节点 ,需要被删除。

叶子节点,就是没有子节点的节点。

提示:

  • 树中节点数目在范围 [1, 5000]
  • -105 <= Node.val <= 105
  • -109 <= limit <= 109

# 测试用例

用例1:
图片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:

图片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:

图片3

  • 输入:root = [1,2,-3,-5,null,4,null], limit = -1
  • 输出:[1,null,-3,4]

# 代码实现

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} limit
 * @return {TreeNode}
 */
var sufficientSubset = function(root, limit) {
    // 先序遍历,同时记录和
  	// 注意:空节点返回false,因为此时false的效果就跟返回Null是一样的
    // 大于等于limit 则不是不足结点 返回true 不删除
    // 小于limit 则是不足结点 返回false 要删除
    // 最后返回的是 —— 左右子树有true就返回true,同时为false返回false

    let traversal = (node, sum, limit) => {
        // 处理空结点
        if(node == null){
            return false;
        }
        // 处理叶子结点
        if(node.left == null && node.right == null){
            return sum + node.val >= limit;
        }
        
        const leftSub = traversal(node.left, sum + node.val, limit);
        const rightSub = traversal(node.right, sum + node.val, limit);

        // 是不足结点就删除
        if(!leftSub){
            node.left = null;
        }
        if(!rightSub){
            node.right = null;
        }
        console.log("leftSub:", leftSub);
        console.log("rightSub: ", rightSub);
        console.log("test: ", leftSub || rightSub);
        return leftSub || rightSub;
    }

    const res = traversal(root, 0, limit);
    // 判断最后是否为空
    return res ? root : null;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50