leetcode
leetcode 2001 ~ 2050
判断根结点是否等于子结点之和

判断根结点是否等于子结点之和

难度:

标签:

题目描述

给你一个 二叉树 的根结点 root,该二叉树由恰好 3 个结点组成:根结点、左子结点和右子结点。

如果根结点值等于两个子结点值之和,返回 true ,否则返回 false

 

示例 1:

输入:root = [10,4,6]
输出:true
解释:根结点、左子结点和右子结点的值分别是 10 、4 和 6 。
由于 10 等于 4 + 6 ,因此返回 true 。

示例 2:

输入:root = [5,3,1]
输出:false
解释:根结点、左子结点和右子结点的值分别是 5 、3 和 1 。
由于 5 不等于 3 + 1 ,因此返回 false 。

 

提示:

  • 树只包含根结点、左子结点和右子结点
  • -100 <= Node.val <= 100

代码结果

运行时间: 16 ms, 内存: 16.6 MB


/*
 * 思路:
 * 给定一个包含3个节点的二叉树,判断根节点的值是否等于其左子节点和右子节点值之和。
 * 我们可以使用Java Stream来简化操作,尽管在这种简单的场景下用Stream有些过度设计。
 */

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

import java.util.stream.Stream;

public class Solution {
    public boolean checkTree(TreeNode root) {
        // 使用Stream进行值的求和并比较
        return Stream.of(root.left.val, root.right.val).mapToInt(Integer::intValue).sum() == root.val;
    }
}

解释

方法:

该题解直接利用了二叉树的定义,通过访问根节点及其左右子节点的值来判断根节点的值是否等于左右子节点值的和。方法简洁,直接比较根节点的值与左右子节点值之和即可得出结果。

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
在`TreeNode`类定义中,如果左子节点或右子节点为None,`checkTree`函数是否能够正确处理这种情况?
在当前的`checkTree`函数实现中,如果左子节点或右子节点为None,则访问`root.left.val`或`root.right.val`会引发`AttributeError`,因为None类型没有`val`属性。因此,该函数不能正确处理左或右子节点为None的情况。解决这个问题需要在访问子节点的值之前添加对子节点是否为None的检查。
🦆
题目假设树恰好包含3个节点,但如果实际输入不符合这个假设,例如根节点下只有一个子节点,`checkTree`函数会如何响应?
如前所述,如果树的结构不符合恰好有一个根节点和两个子节点的假设,`checkTree`函数也将无法正常工作并抛出错误。例如,如果根节点下只有一个子节点,访问不存在的子节点的`val`属性时会引发错误。因此,函数在这种情况下会失败,需要增加对树结构的检查以确保输入的有效性。
🦆
算法在处理可能的输入错误或异常情况时是否有足够的鲁棒性,例如输入的根节点是None时应如何处理?
当前的`checkTree`函数没有处理根节点为None的情况。如果根节点是None,函数将无法进行比较操作并可能引发异常。为了提高鲁棒性,应在函数开始时检查根节点是否为None,并相应地返回一个合理的结果(例如False),或者抛出一个明确的异常来指示输入不符合预期。
🦆
在本题解中,`TreeNode`的构造函数允许节点值为0,那么在特定情况下(例如所有节点值为0),解决方案是否仍然有效?
在所有节点值为0的特定情况下,该解决方案仍然有效。这是因为根据题目逻辑,根节点的值等于其左右子节点之和是有效的条件,即0 = 0 + 0。因此,即使所有节点的值都为0,该解决方案也可以正确地返回True,符合题目要求。

相关问题