Easy

题目描述

给你一个满二叉树的根节点 root,满二叉树有以下性质:

  • 叶子节点的值为 01,其中 0 表示 False1 表示 True
  • 非叶子节点的值为 23,其中 2 表示布尔 OR3 表示布尔 AND

节点的 计算 按如下规则:

  • 如果节点是叶子节点,那么计算结果为节点的值,即 TrueFalse
  • 否则,计算两个孩子的值,并将该节点的布尔运算应用于两个孩子的计算结果。

返回根节点 root 的布尔计算结果。

满二叉树是每个节点都有 0 个或 2 个孩子的二叉树。

叶子节点是没有孩子的节点。

示例 1:

输入:root = [2,1,3,null,null,0,1]
输出:true
解释:上图展示了计算过程。
AND 节点计算结果为 False AND True = False 。
OR 节点计算结果为 True OR False = True 。
根节点计算结果为 True ,所以我们返回 true 。

示例 2:

输入:root = [0]
输出:false
解释:根节点是叶子节点,计算结果为 false ,所以我们返回 false 。

提示:

  • 树中节点数目在 [1, 1000] 范围内
  • 0 <= Node.val <= 3
  • 每个节点都有 0 个或 2 个孩子
  • 叶子节点的值为 01
  • 非叶子节点的值为 23

解题思路

解题思路

这是一道典型的二叉树递归问题,核心思想是自底向上的计算过程。

思路分析:

  1. 递归基础情况:当到达叶子节点时,直接返回节点值对应的布尔值(0对应False,1对应True)

  2. 递归过程:对于非叶子节点,需要:

    • 递归计算左子树的布尔值
    • 递归计算右子树的布尔值
    • 根据当前节点的值执行相应的布尔运算(2表示OR,3表示AND)
  3. 运算规则

    • 值为2:执行 left_result OR right_result
    • 值为3:执行 left_result AND right_result

这种方法本质上是后序遍历(先处理子节点,再处理当前节点),时间复杂度为O(n),空间复杂度为O(h),其中h是树的高度。

推荐解法:递归解法简洁直观,完美契合题目的自然结构,是最优解。

代码实现

class Solution {
public:
    bool evaluateTree(TreeNode* root) {
        // 叶子节点:返回对应的布尔值
        if (!root->left && !root->right) {
            return root->val == 1;
        }
        
        // 递归计算左右子树
        bool leftResult = evaluateTree(root->left);
        bool rightResult = evaluateTree(root->right);
        
        // 根据节点值执行相应的布尔运算
        if (root->val == 2) {
            return leftResult || rightResult;  // OR
        } else {
            return leftResult && rightResult;  // AND
        }
    }
};
class Solution:
    def evaluateTree(self, root: Optional[TreeNode]) -> bool:
        # 叶子节点:返回对应的布尔值
        if not root.left and not root.right:
            return root.val == 1
        
        # 递归计算左右子树
        left_result = self.evaluateTree(root.left)
        right_result = self.evaluateTree(root.right)
        
        # 根据节点值执行相应的布尔运算
        if root.val == 2:
            return left_result or right_result  # OR
        else:
            return left_result and right_result  # AND
public class Solution {
    public bool EvaluateTree(TreeNode root) {
        // 叶子节点:返回对应的布尔值
        if (root.left == null && root.right == null) {
            return root.val == 1;
        }
        
        // 递归计算左右子树
        bool leftResult = EvaluateTree(root.left);
        bool rightResult = EvaluateTree(root.right);
        
        // 根据节点值执行相应的布尔运算
        if (root.val == 2) {
            return leftResult || rightResult;  // OR
        } else {
            return leftResult && rightResult;  // AND
        }
    }
}
var evaluateTree = function(root) {
    if (root.left === null && root.right === null) {
        return root.val === 1;
    }
    
    const leftVal = evaluateTree(root.left);
    const rightVal = evaluateTree(root.right);
    
    if (root.val === 2) {
        return leftVal || rightVal;
    } else {
        return leftVal && rightVal;
    }
};

复杂度分析

复杂度类型复杂度说明
时间复杂度O(n)需要访问树中的每个节点一次,其中n是节点总数
空间复杂度O(h)递归调用栈的深度等于树的高度h,最坏情况下h=n

相关题目