【递归搜索回溯专栏】专题二:二叉树中的深搜----计算布尔二叉树的值

简介: 【递归搜索回溯专栏】专题二:二叉树中的深搜----计算布尔二叉树的值


题目来源

本题来源为:

Leetcode 2331. 计算布尔二叉树的值

题目描述

给你一棵 完整二叉树 的根,这棵树有以下特征:

叶子节点 要么值为 0 要么值为 1 ,其中 0 表示 False ,1 表示 True 。

非叶子节点 要么值为 2 要么值为 3 ,其中 2 表示逻辑或 OR ,3 表示逻辑与 AND 。

计算 一个节点的值方式如下:

如果节点是个叶子节点,那么节点的 值 为它本身,即 True 或者 False 。

否则,计算 两个孩子的节点值,然后将该节点的运算符对两个孩子值进行 运算 。

返回根节点 root 的布尔运算值。

完整二叉树 是每个节点有 0 个或者 2 个孩子的二叉树。

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

题目解析

我们举个例子:

题目说的是,2是逻辑或,3是逻辑与,0为false,1为true.

在根节点2那么他就是逻辑或,2的左节点为1,那么他就是true,2的右子树中:

3是逻辑与,要想将3节点的结果返回给根节点2,就需要知道3节点的左子树与右子树。3的左节点为0,那么就是false,右节点为1,那么就为true,取一个逻辑与,那么3节点的布尔值就为false.

现在看根节点2,左边是true,右边是false,取一个逻辑或,那么最后结果就是true,所以最后整棵树的布尔值就为true。

算法原理

把题目解析分析完,就很容易看出来相同的子问题:

要想知道根节点的布尔值,就需要知道根节点的左子树与右子树的布尔值。

计算左子树与右子树的布尔值的方法是一致的。

也可以近似理解为就相当与后序遍历一下这棵树。

函数头

函数头很简单,我们就传入根即可。

函数体

要想知道根的布尔,就需要知道根的左子树与右子树的值:

那么我们直接传入根的左子树与右子树(黑盒)我们相信这个黑盒一定能帮我们完成任务。

函数返回值

注意这颗二叉树是一颗完整二叉树:

完整二叉树 是每个节点有 0 个或者 2 个孩子的二叉树。

因此我们首先判断根节点是否有左子树,其次根节点的值是否为0;

代码实现

class Solution 
{
public:
    bool evaluateTree(TreeNode* root) 
    {
        if(root->left==nullptr)
            return root->val==0?false:true;
        //递归
        bool left=evaluateTree(root->left);
        bool right=evaluateTree(root->right);
        return root->val==2?(left|right):(left&right);    
    }
};
相关文章
|
缓存 Java 开发工具
Flutter— 第一次运行Flutter工程时的Bug总结
Flutter— 第一次运行Flutter工程时的Bug总结
 Flutter— 第一次运行Flutter工程时的Bug总结
|
数据采集 存储 监控
组建数据治理团队:从无到有的实践指南
通过以上四个步骤,可以从无到有地建立和完善一个高效的数据治理团队。这个团队将帮助企业更好地管理和利用自己的数据资产,从而为企业创造更大的价值。
|
4天前
|
云安全 人工智能 自然语言处理
|
8天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
800 17
|
11天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
803 59
Meta SAM3开源:让图像分割,听懂你的话
|
2天前
|
人工智能 安全 小程序
阿里云无影云电脑是什么?最新收费价格个人版、企业版和商业版无影云电脑收费价格
阿里云无影云电脑是运行在云端的虚拟电脑,分企业版和个人版。企业版适用于办公、设计等场景,4核8G配置低至199元/年;个人版适合游戏、娱乐,黄金款14元/月起。支持多端接入,灵活按需使用。
235 164
|
9天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
335 116