Easy
题目描述
给你一个满二叉树的根节点 root,满二叉树有以下性质:
- 叶子节点的值为
0或1,其中0表示False,1表示True。 - 非叶子节点的值为
2或3,其中2表示布尔OR,3表示布尔AND。
节点的 计算 按如下规则:
- 如果节点是叶子节点,那么计算结果为节点的值,即
True或False。 - 否则,计算两个孩子的值,并将该节点的布尔运算应用于两个孩子的计算结果。
返回根节点 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个孩子 - 叶子节点的值为
0或1 - 非叶子节点的值为
2或3
解题思路
解题思路
这是一道典型的二叉树递归问题,核心思想是自底向上的计算过程。
思路分析:
递归基础情况:当到达叶子节点时,直接返回节点值对应的布尔值(0对应False,1对应True)
递归过程:对于非叶子节点,需要:
- 递归计算左子树的布尔值
- 递归计算右子树的布尔值
- 根据当前节点的值执行相应的布尔运算(2表示OR,3表示AND)
运算规则:
- 值为2:执行
left_result OR right_result - 值为3:执行
left_result AND right_result
- 值为2:执行
这种方法本质上是后序遍历(先处理子节点,再处理当前节点),时间复杂度为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 |