计算布尔二叉树的值

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

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

计算 一个节点的值方式如下: 如果节点是个叶子节点,那么节点的 值 为它本身,即 True 或者 False 。 否则,计算 两个孩子的节点值,然后将该节点的运算符对两个孩子值进行 运算 。 返回根节点 root 的布尔运算值。

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

2331. 计算布尔二叉树的值 - 力扣(LeetCode)

解题思路

递归是解决这个问题的一个关键部分。在二叉树的相关问题中,递归经常被用来遍历树结构,因为它允许我们在不显式使用栈或队列的情况下,通过函数调用栈隐式地维护一个访问节点的顺序。

  1. 定义节点结构
    使用TreeNode结构来表示树的节点,包含节点的值和左右孩子指针。

  2. 递归遍历
    使用递归函数遍历树的节点。对于每个节点,根据其值判断是叶子节点还是非叶子节点,并分别处理。

  3. 逻辑运算

    • 如果节点是叶子节点(值为0或1),直接返回对应的布尔值。
    • 如果节点是非叶子节点,根据其值(2或3)分别进行逻辑或和逻辑与运算,并返回结果。
bool evaluateTree(TreeNode* root) {  // 基本情况(叶子节点)  if (root->val == 0) {  return false;  } else if (root->val == 1) {  return true;  }  // 递归情况(非叶子节点)  // 对于非叶子节点,我们需要计算其左右孩子的值  bool leftValue = evaluateTree(root->left);  // 递归调用,计算左孩子的值  bool rightValue = evaluateTree(root->right); // 递归调用,计算右孩子的值  // 根据当前节点的运算符(由 val 决定),返回相应的逻辑运算结果  if (root->val == 2) {  // 当前节点是逻辑或 OR 运算符  return leftValue || rightValue;  } else if (root->val == 3) {  // 当前节点是逻辑与 AND 运算符  return leftValue && rightValue;  }  // 理论上不会执行到这里,因为题目已经限定节点值只能是0, 1, 2, 3  // 但为了代码的健壮性,最好还是加上这个返回语句  return false; // 这是一个默认返回,实际上不会被执行  
}

 递归的拆解

  1. 基本情况
    • 当我们遇到一个叶子节点时(即节点的值为0或1),我们不需要再递归调用,因为叶子节点没有孩子。我们直接返回该节点的布尔值(0对应false,1对应true)。
  2. 递归情况
    • 当我们遇到一个非叶子节点时(即节点的值为2或3),我们需要计算其左右孩子的值。
    • 我们通过递归调用evaluateTree函数来计算左孩子的值(leftValue)和右孩子的值(rightValue)。
    • 在递归调用中,我们实际上是在处理一个更小的子问题:计算一个子树的根节点的布尔值。
    • 递归调用会继续进行,直到我们遇到叶子节点为止。一旦我们到达叶子节点,递归就会开始回溯,每个递归调用都会返回一个布尔值给它的调用者。
  3. 回溯
    • 在回溯过程中,我们根据当前节点的运算符(2或3)和左右孩子的值(leftValuerightValue)来计算当前节点的布尔值。
    • 然后,这个值会被返回给当前节点的父节点的递归调用。
  4. 终止
    • 递归会在所有叶子节点都被访问并处理完毕后终止。由于树是有限的,递归调用最终会耗尽所有的节点,并返回到最初的调用点(即根节点的递归调用)。
  5. 结果
    • 最终,根节点的递归调用会返回一个布尔值,这个值就是整个树的逻辑运算结果。

注意事项

  • 递归函数必须有一个明确的终止条件(基本情况),否则会导致无限递归和栈溢出。
  • 在递归调用中,我们实际上是在将问题分解成更小的子问题来解决。
  • 递归的关键在于理解函数调用的栈行为,以及每个递归调用如何与它的子调用和父调用相关联。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/58941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

找出目标值在数组中的开始和结束位置(二分查找)

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1&#xff1a…

0xGame 2024 [Week 4] Jenkins

1.前言 由于好久没做web题了,所以今天来尝试来做一波web题,仅供刷题记录。 2.题目 这个给的提示对于小白来说实在是友好的过劲。 3.分析 上网搜到一个关于Jenkins的历史漏洞,下面链接可供参考 https://blog.csdn.net/2301_80127209/arti…

yolov8训练及测试(ubuntu18.04、tensorrt、ros)

1 数据集制作 1.1标注数据 Linux/Ubuntu/Mac 至少需要 Python 2.6 (推荐使用 Python 3 或更高版本 及 PyQt5) Ubuntu Linux (Python 3 Qt5) git clone https://gitcode.com/gh_mirrors/la/labelImg.git sudo apt-get install pyqt5-dev-tools cd lab…

Nginx 反向代理(解决跨域)

文章目录 前言一、同源策略二、跨域是什么?三、Nginx解决跨域1.前端示例代码2.说明 四、nginx反向代理配置五、启动nginx六、最终效果总结 前言 Nginx反向代理解决跨域 一、同源策略 定义:同源策略(Same-Origin Policy)是指浏览…

clickhouse配置用户角色与权限

首先找到user.xml文件&#xff0c;默认在/etc/clickhouse-server路径下 一、配置角色 找到标签定义 <aaaa><readonly>1</readonly><allow_dll>0</allow_dll> </aaaa>其中aaaa为角色名称&#xff0c;readonly为只读权限&#xff08;0–代表…

ssm《数据库系统原理》课程平台的设计与实现+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容…

多渠道流量获取策略提升网站访问量的有效方法

内容概要 在当今数字时代&#xff0c;企业面临着越来越激烈的竞争&#xff0c;流量获取变得极为重要。多渠道流量获取不仅可以增加网站的访问量&#xff0c;还能够有效提升品牌的知名度和影响力。通过整合多种渠道&#xff0c;企业能够更好地触达目标受众&#xff0c;实现精准…

kafka实时返回浏览数据

在安装完kafka(Docker安装kafka_docker 部署kafka-CSDN博客)&#xff0c;查看容器是否启动&#xff1a; docker ps | grep -E kafka|zookeeper 再用python开启服务 from fastapi import FastAPI, Request from kafka import KafkaProducer import kafka import json import …

【MyBatis源码】BoundSql分析

基础 BoundSql是对SQL语句及参数信息的封装&#xff0c;它是SqlSource解析后的结果。Executor组件并不是直接通过StaticSqlSource对象完成数据库操作的&#xff0c;而是与BoundSql交互。BoundSql是对Executor组件执行SQL信息的封装&#xff0c;具体实现代码如下&#xff1a; …

Vue3 + Pinia:轻松读取数据的终极指南

Hey小伙伴们&#xff01;今天我们要聊的是Vue3中一个非常强大的状态管理库——Pinia。Pinia不仅简化了状态管理的复杂度&#xff0c;还提供了丰富的功能&#xff0c;让你在读取数据时更加得心应手。让我们一起来看看如何在Vue3项目中使用Pinia读取数据吧&#xff01;&#x1f3…

A Consistent Dual-MRC Framework for Emotion-cause Pair Extraction——论文阅读笔记

前言 这是我第一次向同学院同年级的学生和老师们汇报的第一篇论文,于2022年发表在TOIS上,属于CCF A类,主要内容是将MRC应用到情感原因对抽取中。 论文链接:用于情绪-原因对提取的一致双 MRC 框架 |信息系统上的 ACM Transactions 这里我就不放上我自己翻译的中文版还有我…

【Linux系统】—— 基本指令(一)

【Linux系统】—— 基本指令&#xff08;一&#xff09; 1 「ls」指令1.1 初识 「ls」 指令1.2 「ls -l」1.3 认识文件1.4 「ls -l」显示的内容1.5 如何区分文件类型1.6 「ls -a」1.7 混合使用命令行选项1.8 「ls」查看指定目录下文件1.9 「ls」 指令常用命令行选项 2 「pwd」 …

虚拟机安装Ubuntu系统

1、下载虚拟机 虚拟机下载链接 链接&#xff1a;https://pan.baidu.com/s/1JTSDhcw-_uQfMYPQbNuJ9w 提取码&#xff1a;hkf0 秘钥 JU090-6039P-08409-8J0QH-2YR7F 2、Ubuntu镜像下载 下载Ubuntu桌面系统 | Ubuntu 3、设置虚拟机 参考下文 虚拟机安装Ubuntu教程(详细)-C…

js,ts控制流程

摘要&#xff1a; 在 JavaScript 和 TypeScript 中&#xff0c;控制流程是指程序执行的顺序和条件判断。以下是一些常见的控制流程结构&#xff0c;包括条件语句、循环语句和函数调用等。 1. 条件语句&#xff1a; if 语句 let condition true;if (condition) {console.log(C…

计组-Cache的基本概念,计算Cache+主存的平均周期

由于寄存器是集成在CPU中且容量极小&#xff0c;所以我们用Cache来提高速度&#xff0c;在无寄存器时其当做访问速度最快的 Cache的命中率: 是指当CPU要处理某个数据时&#xff0c;首先会考虑在Cache里面去读取&#xff0c;当需要读取的数据在Cache里面时&#xff0c;此时这个…

《大数据与人工智能:提升数据质量与数量的利器》

《大数据与人工智能&#xff1a;提升数据质量与数量的利器》 一、大数据与人工智能的融合趋势二、大数据增加数据数量的方法&#xff08;一&#xff09;不同途径的数据增量&#xff08;二&#xff09;数据增强的多样方法 三、人工智能提升数据数量的手段&#xff08;一&#xf…

【JAVA】Java基础—Java概述:Java的特点

Java语言因其独特的设计理念和强大的功能&#xff0c;在软件开发领域获得了广泛的应用。以下是Java的几个主要特点的详细说明&#xff0c;以及通俗易懂的例子来帮助理解这些概念。 1. 跨平台性 理论说明 Java的跨平台性是其最显著的特点之一&#xff0c;得益于Java虚拟机&am…

算法中使用的数据结构解释*

算法中使用的数据结构解释 在算法的执行过程中&#xff0c;需要有能够容纳临时数据的内存数据结构。数据结构的有效实施需要选择适当的数据结构。迭代或递归算法需要专门为其逻辑设计的数据结构。 也有人表述为容器&#xff0c;存放数据的容器。 在递归算法的情况下&#xff0c…

UE4安卓Gradle工程中的libUE4.so的生成原理

流程图 流程图放在最前面&#xff0c;下面是讲解。 libUE4.so 问&#xff1a;在UE4安卓开发中&#xff0c;libUE4.so即是符号表&#xff0c;又是引擎代码native&#xff0c;是吗&#xff1f; 答&#xff1a;是的&#xff0c;libUE4.so在UE4安卓开发中既包含符号表&#xff0c;…

一文囊括风控建模中的变量筛选方法

风控建模在金融领域中起着至关重要的作用,特别是在信贷和支付领域。为了构建稳定和有效的风控模型,变量筛选是一个必不可少的步骤。本文将详细介绍几种在风控建模中常用的变量筛选方法。 文章目录 一、变量自身分布稳定性1 变量PSI值计算2 长期趋势图二、变量和目标值的强相关…