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

news2024/11/24 17:04:50

文章目录

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

题目

标题和出处

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

出处: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.coloradmin.cn/o/786443.html

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

相关文章

vue权限按钮的实现

鉴权函数 由于下面几种方式都需要用到鉴权函数&#xff0c;所以将其放置在组件外面&#xff0c;供组件或其他文件调用。 // src/utils/hasPermission.jsimport { usePermissionStore } from /stores import array from lodash/array export const hasPermission (value, def…

火车头采集文章批量伪原创【php源码】

火车头采集是一款基于Python语言开发的网络爬虫工具&#xff0c;用于快速高效地从互联网上采集数据并存储到本地或远程数据库。它简单易用且功能强大&#xff0c;在各行各业广泛应用。 火车头采集器AI伪原创PHP源码&#xff1a; <?php header("Content-type: text/h…

C# WPF项目创建(基于VS 2019介绍)

1.打开VS&#xff0c;选择《创建新项目》 2.选择《WPF应用程序》&#xff0c;如图 3. 项目名称根据需求自行命名&#xff0c;这边以“WpfApp1”来命名&#xff0c;位置自行选择&#xff0c;这边选择了"E:\test"&#xff0c;如图所示&#xff0c;“将解决方案和项目…

【广州华锐互动】VR模拟灭火逃生体验系统

VR模拟灭火逃生体验系统由广州华锐互动开发&#xff0c;是一种基于虚拟现实技术的应急演练与培训系统&#xff0c;可以真实模拟消防逃生场景&#xff0c;让体验者在沉浸式的虚拟环境中&#xff0c;根据正确的消防逃生方法提示&#xff0c;进行自救演练。这种科学普及方法是更加…

datafree KD CVPR2023 学习笔记(Abstract)

这个 是摘要的前部分 摘要 简单的提及 无数据的蒸馏 是怎么样的 和普通的蒸馏有一个本质的区别&#xff1a;没有训练数据 很火啊 最近 在对抗性的蒸馏框架中呢 存在一个问题 由于多个生成器生成的 非平稳分布的pseudo-samples 导致了学生网络的性能不好 提出一个解决方案的i…

Docker——数据管理与网络通信

Docker——数据管理与网络通信 一、Docker 的数据管理1&#xff0e;数据卷2&#xff0e;数据卷容器 二、端口映射三、容器互联&#xff08;使用centos镜像&#xff09;四、Docker 镜像的创建1&#xff0e;基于现有镜像创建1.1 首先启动一个镜像&#xff0c;在容器里做修改1.2 然…

如何搭建使用dubbo-Admin?

dubbo-Admin介绍 一款用于dubbo可视化界面操作的管理平台 dubbo-Admin特点 dubbo-Admin是dubbo的管理界面平台&#xff0c;且是一个前后端分离的项目&#xff0c;前端使用vue&#xff0c;后端使用springboot。 软件下载 dubbo-admin-0.5.0.zip 软件使用

Java文件的相对路径规则

前言 最近做项目&#xff0c;又涉及到Linux Java文件的相对路径&#xff0c;但是相对路径在不同的服务器或者docker上居然不一样&#xff0c;这个就很难受&#xff0c;只能用绝对路径解决&#xff0c;因为绝对路径是固定的路径&#xff0c;但是相对路径为什么会在不同的服务器…

将pdf转换成word怎么转换?掌握这几个转换方法就够了

将pdf转换成word怎么转换&#xff1f;将 PDF 转换成 Word 文档是一个常见的需求&#xff0c;我们需要编辑 PDF 文件中的文字内容&#xff0c;但是 PDF 文件并不方便直接编辑。下面介绍几个转换方法。 方法一&#xff1a;使用迅捷 PDF 转换器 这是一款专业的 PDF 转换工具&…

【2023】HashMap详细源码分析解读

前言 在弄清楚HashMap之前先介绍一下使用到的数据结构&#xff0c;在jdk1.8之后HashMap中为了优化效率加入了红黑树这种数据结构。 树 在计算机科学中&#xff0c;树&#xff08;英语&#xff1a;tree&#xff09;是一种抽象数据类型&#xff08;ADT&#xff09;或是实作这种…

2023年深圳杯数学建模 D题 基于机理的致伤工具推断

致伤工具的推断一直是法医工作中的热点和难点。由于作用位置、作用方式的不同&#xff0c;相同的致伤工具在人体组织上会形成不同的损伤形态&#xff0c;不同的致伤工具也可能形成相同的损伤形态。致伤工具品种繁多、形态各异&#xff0c;但大致可分为两类&#xff1a;锐器&…

结构体——位段

//结构体--位段 &#xff08;位 指二进制位 &#xff09; // 位段的声明与结构体是类似的 // 1&#xff0c;位段的成员必须是 int &#xff0c;unsigned int 或 signed int // 2&#xff0c;位段的成员名后边有一个冒号和一个数字。&#xff08;数字表示开辟需要的比特位个数&a…

【【51单片机的温度识别】】

51单片机的温度识别 这么热的天&#xff0c;再离我远一点 DS18B20温度读取 温度报警 我们这里对于单总线 也仿照I2C 总线的模样 以下是我们实现的onewire.c文件 #include <REGX52.H> //第一步从原理图触发先定义端口sbit OneWire_DQP3^7;//第一步初始化unsigned char…

商城-学习整理-基础-前端(四)

目录 一、技术栈介绍二、ES61、简介2、什么是ECMAScript3、ES6 新特性1、let 声明变量2、const 声明常量&#xff08;只读变量&#xff09;3、解构表达式1&#xff09;数组解构2&#xff09;对象解构 4、字符串扩展1&#xff09;、几个新的 API2&#xff09;、字符串模板 5、函…

跨洋消息队列CKafka

背景 跨洋消息队列CKafka&#xff0c;是腾讯出品开源消息队列组件&#xff0c;为了解决客户跨地域容灾、冷备的诉求跨地域秒级准实时数据同步而开源的腾讯云中间件。 整体架构图 数据同步主要流程 Connect 集群初始化 Connect Task&#xff0c;每个 Task 会新建多个 Worker C…

3D元宇宙游戏,或许能引爆新的文娱消费增长点

从去年开始&#xff0c;在互联网上&#xff0c;一个名为【神念无界-源起山海】的元宇宙游戏项目火了。除了可以在游戏内体验独战、团队式作战等3D古风经典游戏场景和玩法&#xff0c;还有钓鱼增加能量、情侣姻缘一线牵&#xff0c;结婚等多元化逼真效果与玩法&#xff0c;这令很…

第118天:免杀对抗-二开CS上线流量特征Shellcode生成机制反编译重打包(上)

知识点 #知识点&#xff1a; 1、CS-表面特征消除 2、CS-HTTP流量特征消除 3、CS-Shellcode特征消除#章节点&#xff1a; 编译代码面-ShellCode-混淆 编译代码面-编辑执行器-编写 编译代码面-分离加载器-编写 程序文件面-特征码定位-修改 程序文件面-加壳花指令-资源 代码加载面…

opencv-21 alpha 通道详解(应用于 图像增强,合成,蒙版,特效 等)

什么是alpha 通道&#xff1f; Alpha通道是计算机图形学中用于表示图像透明度的一种通道。在一个图像中&#xff0c;通常会有三个颜色通道&#xff1a;红色&#xff08;R&#xff09;、绿色&#xff08;G&#xff09;、蓝色&#xff08;B&#xff09;&#xff0c;它们合在一起…

将Parasoft和ChatGPT相结合会如何?

ChatGPT是2023年最热门的话题之一&#xff0c;是OpenAI训练的语言模型。它能够理解和生成自然语言文本&#xff0c;并接受过大量数据的训练&#xff0c;包括用各种编程语言编写的许多开源项目的源代码。 软件开发人员可以利用大量的知识库来协助他们的工作&#xff0c;因为它具…

网络安全高级课笔记1

HTML字符编码/HTML实体编码 html实体编码 unicode urlcode 在字符的十六进制前加百分号&#xff08;%&#xff09;&#xff0c;用于浏览器的网址输入框 utf-8 字符数字表示法 HTML允许使用Nuicode码点表示字符&#xff0c;浏览器会自动将码点转成对应的字符。 字符的码点表…