二叉树题目:从根到叶的二进制数之和

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:从根到叶的二进制数之和

出处:1022. 从根到叶的二进制数之和

难度

3 级

题目描述

要求

给你二叉树的根结点 root \texttt{root} root,其中每个结点的值都是 0 \texttt{0} 0 1 \texttt{1} 1。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。

  • 例如,如果路径为 0 → 1 → 1 → 0 → 1 \texttt{0} \rightarrow \texttt{1} \rightarrow \texttt{1} \rightarrow \texttt{0} \rightarrow \texttt{1} 01101,那么它表示二进制数 01101 \texttt{01101} 01101,也就是 13 \texttt{13} 13

对树上的每一个叶结点,我们都要找出从根结点到该叶结点的路径所表示的数字。返回这些数字之和。

题目数据保证答案是一个 32 \texttt{32} 32 位整数。

示例

示例 1:

示例 1

输入: root = [1,0,1,0,1,0,1] \texttt{root = [1,0,1,0,1,0,1]} root = [1,0,1,0,1,0,1]
输出: 22 \texttt{22} 22
解释: 100 (2) + 101 (2) + 110 (2) + 111 (2) = 4 + 5 + 6 + 7 = 22 \texttt{100}_\texttt{(2)} + \texttt{101}_\texttt{(2)} + \texttt{110}_\texttt{(2)} + \texttt{111}_\texttt{(2)} = \texttt{4} + \texttt{5} + \texttt{6} + \texttt{7} = \texttt{22} 100(2)+101(2)+110(2)+111(2)=4+5+6+7=22

示例 2:

输入: root = [0] \texttt{root = [0]} root = [0]
输出: 0 \texttt{0} 0

数据范围

  • 树中结点数目在范围 [1, 1000] \texttt{[1, 1000]} [1, 1000]
  • Node.val \texttt{Node.val} Node.val 0 \texttt{0} 0 1 \texttt{1} 1

解法一

思路和算法

为了计算所有的从根到叶的二进制数之和,需要对每个叶结点计算从根结点到该叶结点的路径表示的二进制数。可以在遍历路径的过程中计算二进制数。

对于根结点,其表示的二进制数即为结点值本身。对于非根结点,假设当前结点的值为 val \textit{val} val,其父结点对应的二进制数为 prevSum \textit{prevSum} prevSum,则当前结点对应的二进制数为 currSum = prevSum × 2 + val \textit{currSum} = \textit{prevSum} \times 2 + \textit{val} currSum=prevSum×2+val。当遇到叶结点时,将叶结点对应的二进制数加到二进制数之和即可。

计算每个结点对应的二进制数与计算所有的从根到叶的二进制数之和都可以使用深度优先搜索实现。

计算二叉树的所有从根到叶的二进制数之和时,需要分别计算每个非空子树的所有从根到叶的二进制数之和,整个过程是一个递归的过程,递归的终止条件是当前结点为叶结点。对于其余情况,首先计算当前结点对应的二进制数,然后对非空子结点调用递归。

代码

class Solution {public int sumRootToLeaf(TreeNode root) {return sumInSubtree(root, 0);}public int sumInSubtree(TreeNode node, int prevSum) {int currSum = prevSum * 2 + node.val;if (node.left == null && node.right == null) {return currSum;}if (node.left == null) {return sumInSubtree(node.right, currSum);}if (node.right == null) {return sumInSubtree(node.left, currSum);}return sumInSubtree(node.left, currSum) + sumInSubtree(node.right, currSum);}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉树的高度,最坏情况下二叉树的高度是 O ( n ) O(n) O(n)

解法二

思路和算法

也可以使用广度优先搜索计算所有的从根到叶的二进制数之和。

由于在遍历二叉树的同时需要记录每个结点对应的二进制数,因此需要维护两个队列,分别存储结点与对应的二进制数。初始时,两个队列中分别只有根结点与根结点值。遍历过程中,每次从两个队列分别将一个元素出队列,这两个出队列的元素是一个结点和该结点对应的二进制数,执行如下操作。

  • 如果当前结点是叶结点,即左子结点和右子结点都为空,则将当前结点对应的二进制数加到二进制数之和。

  • 如果当前结点不是叶结点,则每个非空子结点对应的二进制数等于当前结点对应的二进制数乘以 2 2 2 再加上非空子结点值,将非空子结点和非空子结点对应的二进制数分别入两个队列。

遍历结束之后,即可得到所有的从根到叶的二进制数之和。

代码

class Solution {public int sumRootToLeaf(TreeNode root) {int totalSum = 0;Queue<TreeNode> nodeQueue = new ArrayDeque<TreeNode>();Queue<Integer> sumQueue = new ArrayDeque<Integer>();nodeQueue.offer(root);sumQueue.offer(root.val);while (!nodeQueue.isEmpty()) {TreeNode node = nodeQueue.poll();int sum = sumQueue.poll();TreeNode left = node.left, right = node.right;if (left == null && right == null) {totalSum += sum;}if (left != null) {nodeQueue.offer(left);sumQueue.offer(sum * 2 + left.val);}if (right != null) {nodeQueue.offer(right);sumQueue.offer(sum * 2 + right.val);}}return totalSum;}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是队列空间,两个队列内元素个数都不超过 n n n

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

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

相关文章

Git标签管理(对版本打标签,起别名)

tag 理解标签创建标签git tag [name]git show [tagname] 操作标签删除标签git tag -d < tagname > 推送某个标签到远程git push origin < tagname > 理解标签 标签 tag &#xff0c;可以简单的理解为是对某次 commit 的⼀个标识&#xff0c;相当于起了⼀个别名。 …

C# winform子窗口向父窗口传值

这里我使用一个简单的方法。只需要在父窗口定义一个静态变量就行。 父窗体为Form1,子窗体为Form2。 public static int get_num0; 子窗体直接给get_num赋值即可。 Form1.get_num2; 这样父窗体就能获得get_num修改后这个值了

游戏引擎UE如何革新影视行业?创意云全面支持UE云渲染

虚幻引擎UE&#xff08;Unreal Engine&#xff09;作为一款“殿堂级”的游戏引擎&#xff0c;占据了全球80%的商用游戏引擎市场&#xff0c;但如果仅仅将其当做游戏开发的工具&#xff0c;显然是低估了它的能力。比如迪士尼出品的电视剧《曼达洛人》、电影《狮子王》等等都使用…

Matlab 点云曲面特征提取

文章目录 一、简介二、实现代码2.1基于k个邻近点2.2基于邻近半径参考资料一、简介 这里基于每个点的邻域协方差来获取点云中具有的曲面几何特征的点,计算方式如下图所示: 二、实现代码 2.1基于k个邻近点 SurfaceVar.m %% *******</

【网络代理】(三)Docker+Haproxy 搭建四层代理

目录 1.1 创建 web 服务器镜像 1.2 启动 web 服务器容器 2.1 编写 haproxy 配置文件 2.2 拉取 haproxy 镜像 2.3 启动 haproxy 容器 3.1 访问 8000 端口 3.2 查看 web 服务器容器日志 附录&#xff1a;haproxy 仪表板 1.1 创建 web 服务器镜像 编写一个 Docke…

uniapp实战

上面是tab栏&#xff0c;下面是swiper&#xff0c;&#xff0c;tab和swiper和 红色滑块 动态变化&#xff0c;&#xff0c; 遇到的问题&#xff1a; 往下滚动 tab栏 吸顶&#xff1a; position:sticky; z-index:99; top:0;swiper切换触发 change 事件&#xff0c; :current …

Golang GORM 模型定义

模型定义 参考文档&#xff1a;https://gorm.io/zh_CN/docs/models.html 模型一般都是普通的 Golang 的结构体&#xff0c;Go的基本数据类型&#xff0c;或者指针。 模型是标准的struct,由Go的基本数据类型、实现了Scanner和Valuer接口的自定义类型及其指针或别名组成&#x…

Android TelephonyManager双卡获取数据开启状态异常的可能原因

背景 应用内不指定subId获取数据状态可能会错误&#xff0c;因为可能拿到voice的能力&#xff0c;而非data。 代码逻辑 1、通过TelephonyManager的isDataEnabled()没有指定subId时&#xff0c;调用内部方法isDataEnabledForReason&#xff0c;传入getId()参数以指定subid&am…

FUNBOX_SCRIPTKIDDIE靶机详解

FUNBOX_SCRIPTKIDDIE靶机复盘 这个靶场给了太多的干扰因素&#xff0c;当你打完后反过来再看是非常简单的一个靶场&#xff0c;但是你打的过程中却会觉得非常难&#xff0c;干扰因素实在天多了。 题目中给了说加一条hosts&#xff0c;实际没用上。 对IP进行一个单独扫描后发现…

机器学习深度学习——torch.nn模块

机器学习&&深度学习——torch.nn模块 卷积层池化层激活函数循环层全连接层 torch.nn模块包含着torch已经准备好的层&#xff0c;方便使用者调用构建网络。 卷积层 卷积就是输入和卷积核之间的内积运算&#xff0c;如下图&#xff1a; 容易发现&#xff0c;卷积神经网…

uniapp 微信小程序 placeholder字体、颜色自定义

效果图&#xff1a; 1、template <input type"text" placeholder"搜索标题" placeholder-class"placeholder-style"></input>2、style .placeholder-style{color: #2D94FF; }

微服务探索之路06篇k8s配置文件Yaml部署Redis使用Helm部署MongoDB和kafka

1 安装Redis 1.1创建配置文件redis.conf 切换到自己的目录下如本文是放在/home/ubuntu下 cd /home/ubuntuvim redis.conf bind 0.0.0.0 protected-mode yes port 6379 requirepass qwe123456 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize no pidfile /var/run/r…

生产者消费者模型

生产者消费者模型 文章目录 生产者消费者模型概念原则优点 基于BlockingQueue的生产者消费者模型BlockingQueue模拟实现单生产者消费者模型基于计算任务和存储任务的生产者消费者模型 概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题生产者和消费者彼…

代码随想录| 图论02●695岛屿最大面积 ●1020飞地的数量 ●130被围绕的区域 ●417太平洋大西洋水流问题

#695岛屿最大面积 模板题&#xff0c;很快.以下两种dfs&#xff0c;区别是看第一个点放不放到dfs函数中处理&#xff0c;那么初始化的area一个是1一个是0 int dir[4][2]{0,1,0,-1,1,0,-1,0};void dfs(int x, int y,int n, int m, int &area,vector<vector<bool>…

2023最新谷粒商城笔记之Sentinel概述篇(全文总共13万字,超详细)

Sentinel概述 服务流控、熔断和降级 什么是熔断 当扇出链路的某个微服务不可用或者响应时间太长时&#xff0c;会进行服务的降级&#xff0c;**进而熔断该节点微服务的调用&#xff0c;快速返回错误的响应信息。**检测到该节点微服务调用响应正常后恢复调用链路。A服务调用B服…

构建高效供应商管理体系,提升企业采购能力

随着企业采购规模的不断扩大和全球化竞争的加剧&#xff0c;供应商管理变得越来越重要。构建一个高效的供应商管理体系是企业提升采购能力、降低采购成本的关键一环。本文将重点探讨供应商管理体系的意义和作用&#xff0c;并介绍如何构建一个高效的供应商管理体系。 一、供应商…

SpringBoot复习:(1)常用的SpringApplication.run返回的容器的具体类型是哪个?

run方法中调用了createApplicationContext方法 createApplicationContext方法代码如下&#xff1a; 其中create代码如下&#xff1a; 可见返回的是AnnotationConfigServletWebServerApplicationContext()

【搜索引擎Solr】配置 Solr 以获得最佳性能

Apache Solr 是广泛使用的搜索引擎。有几个著名的平台使用 Solr&#xff1b;Netflix 和 Instagram 是其中的一些名称。我们在 tajawal 的应用程序中一直使用 Solr 和 ElasticSearch。在这篇文章中&#xff0c;我将为您提供一些关于如何编写优化的 Schema 文件的技巧。我们不会讨…

基于Python+WaveNet+CTC+Tensorflow智能语音识别与方言分类—深度学习算法应用(含全部工程源码)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境Tensorflow 环境 模块实现1. 方言分类数据下载及预处理模型构建模型训练及保存 2. 语音识别数据预处理模型构建模型训练及保存 3. 模型测试功能选择界面语言识别功能实现界面方言分类功能实现界面 系统测试1. 训…

【RabbitMQ(day1)】RabbitMQ的概述和安装

入门RabbitMQ 一、RabbitMQ的概述二、RabbitMQ的安装三、RabbitMQ管理命令行四、RabbitMQ的GUI界面 一、RabbitMQ的概述 MQ&#xff08;Message Queue&#xff09;翻译为消息队列&#xff0c;通过典型的【生产者】和【消费者】模型&#xff0c;生产者不断向消息队列中生产消息&…