列表

详情


1973. 值等于子节点值之和的节点数量

给定一颗二叉树的根节点 root ,返回满足条件:节点的值等于该节点所有子节点的值之和 的节点的数量。

一个节点 x 的 子节点 是指从节点 x 出发,到所有叶子节点路径上的节点。没有子节点的节点的子节点和视为 0

 

示例 1:

输入: root = [10,3,4,2,1]
输出: 2
解释:
对于值为10的节点: 其子节点之和为: 3+4+2+1 = 10。
对于值为3的节点:其子节点之和为: 2+1 = 3。

示例 2:

输入: root = [2,3,null,2,null]
输出: 0
解释:
没有节点满足其值等于子节点之和。

示例 3:

输入: root = [0]
输出: 1
解释:
对于值为0的节点:因为它没有子节点,所以自己点之和为0。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
/** * 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: int equalToDescendants(TreeNode* root) { } };

cpp 解法, 执行用时: 328 ms, 内存消耗: 218.8 MB, 提交时间: 2023-10-22 10:50:49

/**
 * 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:
    void fun(TreeNode* root,long& sum,long& ans)
    {
        if(root!=NULL)
        {
            sum+=root->val;
            long temp=0;
            fun(root->left,temp,ans);
            fun(root->right,temp,ans);
            sum+=temp;
            if(temp==root->val)
            ans++;
        }
    }
    int equalToDescendants(TreeNode* root) {
        long ans=0,sum=0;
        fun(root,sum,ans);
        return ans;
    }
};

java 解法, 执行用时: 8 ms, 内存消耗: 70.5 MB, 提交时间: 2023-10-22 10:50:28

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int sum = 0;
    public int equalToDescendants(TreeNode root) {
        dfs(root);
        return sum;
    }

    public int dfs(TreeNode node) {
        if (node == null) return 0;
        int left = dfs(node.left);
        int right = dfs(node.right);
        if (left + right == node.val) sum++;
        return (left + right + node.val);
    }
}

python3 解法, 执行用时: 600 ms, 内存消耗: 137.9 MB, 提交时间: 2023-10-22 10:50:07

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def equalToDescendants(self, root: Optional[TreeNode]) -> int:
        if root is None:
            return 0

        ans = 0
        def dfs(node):
            nonlocal ans
            if node is None:
                return 0

            tot = dfs(node.left) + dfs(node.right)
            if tot == node.val:
                ans += 1

            return tot + node.val

        dfs(root)
        return ans

golang 解法, 执行用时: 216 ms, 内存消耗: 25.3 MB, 提交时间: 2023-10-22 10:49:39

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

var ans int

func dfs(root *TreeNode)  int{
	if root==nil{
		return 0
	}
	node_sum:=0
	//左子树之和
	node_sum+=dfs(root.Left)
	//右子树之和
	node_sum+=dfs(root.Right)
    //左右子树之和等于当前值
	if node_sum==root.Val{
		ans++
	}
	//
	root.Val+=node_sum
	return root.Val
}

func equalToDescendants(root *TreeNode) int {
	ans=0
	dfs(root)
	return ans
}

golang 解法, 执行用时: 248 ms, 内存消耗: 31.8 MB, 提交时间: 2023-10-22 10:49:16

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
 //考虑从下往上递归传值
func equalToDescendants(root *TreeNode) int {
    res:=0
    var sum func(node *TreeNode)int
    sum=func(node *TreeNode)int{
        //递归到空节点时,认为它是0
        if node==nil{return 0}
        //获得当前节点左子树和右子树的和值,left和right
        left:=sum(node.Left)
        right:=sum(node.Right)
        //如果当前节点的值等于左子树值加右子树值,res++
        if node.Val==left+right{res++}
        //向上返回此树的和值
        return node.Val+left+right
    }
    _=sum(root)
    return res
}

上一题