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

标签: 二叉树

难度: Easy

给你一个 二叉树 的根结点 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

Submission

运行时间: 16 ms

内存: 16.6 MB

# Definition for a binary tree node.
from typing import Optional


class TreeNode:
  def __init__(self, val=0, left=None, right=None):
    self.val = val
    self.left = left
    self.right = right


class Solution:
  def checkTree(self, root: Optional[TreeNode]) -> bool:
    return  root.val==root.right.val+root.left.val

Explain

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

时间复杂度: O(1)

空间复杂度: O(1)

# Definition for a binary tree node.
from typing import Optional


class TreeNode:
  def __init__(self, val=0, left=None, right=None):
    self.val = val # 节点的值
    self.left = left # 左子节点
    self.right = right # 右子节点


class Solution:
  def checkTree(self, root: Optional[TreeNode]) -> bool:
    # 直接比较根节点的值是否等于左子节点和右子节点的值之和
    return  root.val == root.left.val + root.right.val

Explore

在当前的`checkTree`函数实现中,如果左子节点或右子节点为None,则访问`root.left.val`或`root.right.val`会引发`AttributeError`,因为None类型没有`val`属性。因此,该函数不能正确处理左或右子节点为None的情况。解决这个问题需要在访问子节点的值之前添加对子节点是否为None的检查。

如前所述,如果树的结构不符合恰好有一个根节点和两个子节点的假设,`checkTree`函数也将无法正常工作并抛出错误。例如,如果根节点下只有一个子节点,访问不存在的子节点的`val`属性时会引发错误。因此,函数在这种情况下会失败,需要增加对树结构的检查以确保输入的有效性。

当前的`checkTree`函数没有处理根节点为None的情况。如果根节点是None,函数将无法进行比较操作并可能引发异常。为了提高鲁棒性,应在函数开始时检查根节点是否为None,并相应地返回一个合理的结果(例如False),或者抛出一个明确的异常来指示输入不符合预期。

在所有节点值为0的特定情况下,该解决方案仍然有效。这是因为根据题目逻辑,根节点的值等于其左右子节点之和是有效的条件,即0 = 0 + 0。因此,即使所有节点的值都为0,该解决方案也可以正确地返回True,符合题目要求。