刷题的日常-计算布尔二叉树的值

573 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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);
    }
}

image.png