开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情
出门好大的雾,和山顶一样
刷题的日常-2023年2月6号
一天一题,保持脑子清爽
计算布尔二叉树的值
来自leetcode的 2331 题,题意如下:
给你一棵 完整二叉树 的根,这棵树有以下特征:
- 叶子节点 要么值为 0 要么值为 1 ,其中 0 表示 False ,1 表示 True 。
- 非叶子节点 要么值为 2 要么值为 3 ,其中 2 表示逻辑或 OR ,3 表示逻辑与 AND 。
计算 一个节点的值方式如下:
- 如果节点是个 叶子节点,那么节点的 值 为它本身,即 True 或者 False 。
- 否则,计算 两个孩子的节点值,然后将该节点的运算符对两个孩子值进行 运算 。
返回根节点 root 的布尔运算值。完整二叉树 是每个节点有 0 个或者 2 个孩子的二叉树。
叶子节点 是没有孩子的节点。
理解题意
通过题意,我们可以将信息整理如下:
- 题目给出一棵二叉树的根节点
- 其中叶子节点代表真假值
- 非叶子节点代表运算符
- 要求我们通过对二叉树进行自底向上扫描计算,返回计算的结果
做题思路
二叉树的扫描我们可以通过递归来做,如果不是叶子节点,则往下递归,如果为空,直接返回false,步骤如下:
- 判断当前进入的节点是否为空,是的话直接返回false即可
- 如果是叶子节点,返回当前的布尔值
- 如果是非叶子几点,根据计算的逻辑,往下递归
- 如果是或逻辑,则用或计算左右两棵子树
- 如果是与逻辑,则用与计算左右两棵子树
代码实现
代码实现如下:
public class Solution {
public boolean evaluateTree(TreeNode root) {
if (root == null) {
return false;
}
if (root.val < 2) {
return root.val != 0;
}
if (root.val == 2) {
return evaluateTree(root.left) || evaluateTree(root.right);
}
return evaluateTree(root.left) && evaluateTree(root.right);
}
}