【刷题日记】1022. 从根到叶的二进制数之和

简介: 本次刷题日记的第 50 篇,力扣题为:从根到叶的二进制数之和,简单

本次刷题日记的第 50 篇,力扣题为:从根到叶的二进制数之和,简单

一、题目描述:

image.png

又是一道二叉树的题,关于二叉树的题相对都是比较简单的,只要想的明白,做起来就会很容易

二、这道题考察了什么思想?你的思路是什么?

题目比较明确,就是让我们从题目给出的二叉树中,找到根节点到每一个叶子节点的路径,再将所有路径求和

稍微不一样的就是每一个路径,我们是需要将路径上的节点组装成 101010 的二进制形式,来进行计算而已,没啥特别的

分析

此处很明显是需要用到二叉树的遍历的,那么我们知道二叉树的递归遍历有 3 种方式

  • 前序遍历,根节点 -> 左节点 -> 右节点
  • 中序遍历,左节点 -> 根节点 -> 右节点
  • 后序遍历,左节点 -> 右节点 -> 根节点

当然,我们使用哪一种遍历的方式,都是可以使用不同的逻辑将题目要求的路线给组装出来,那么咱们任意选择一种,就拿 后序遍历举例子吧

image.png

可以看到图中给出二叉树的第一条路,是 1,0,0

那么,我们如何将这 3 个节点,组装成 100 呢?

其实也是比较明确的

  • 我们遍历到第 1 个节点的时候, val 赋值为 1
  • 遍历到第 2 个节点的时候,val << 1 | 当前节点的值 == 10 | 0 == 10 --> val = 10
  • 同样,当遍历到第 3 个节点的时候,val << 1 | 当前节点的值 == 100 | 0 == 100 --> val = 100 = 4

那么遍历第 2 个条路的时候也是同样的道理,也是可以组装成 101 = 5

image.png

那么我们在计算结果的时候,咱们不难想到,整棵树的链路是左子树的链路和 + 右子树的链路和

那就有 sum(root) = sum(root.left) + sum(root.right)

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码

编码的时候,我们需要注意,当开始遍历的时候,咱们遍历第一个节点的时候,默认值是 0,保证拿到第一个节点的值能直接赋值到 val 上

编码如下:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func helpdfs(node *TreeNode, val int) int {
    if node == nil{
        return 0
    }
    val = val <<  1 | node.Val
    if node.Left == nil && node.Right == nil{
        return val
    }
    return helpdfs(node.Left, val) + helpdfs(node.Right, val)
}
func sumRootToLeaf(root *TreeNode) int {
    return helpdfs(root, 0)
}

四、总结:

image.png

这么看来,时间复杂度是 O(n) ,因为咱们需要遍历 n 个节点,空间复杂度也是 O(n),这里不用奇怪,虽然我们没有额外手动开辟 O(n) 的占用空间,但是我们使用递归的话,是需要消耗栈空间的,因此时间复杂也是 O(n)

原题地址:1022. 从根到叶的二进制数之和

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~


相关文章
|
存储 算法 Go
Golang 数据结构:图
Golang 数据结构:图
184 0
|
资源调度 关系型数据库 MySQL
【Flink on YARN + CDC 3.0】神操作!看完这篇教程,你也能成为数据流处理高手!从零开始,一步步教会你在Flink on YARN模式下如何配置Debezium CDC 3.0,让你的数据库变更数据瞬间飞起来!
【8月更文挑战第15天】随着Apache Flink的普及,企业广泛采用Flink on YARN部署流处理应用,高效利用集群资源。变更数据捕获(CDC)工具在现代数据栈中至关重要,能实时捕捉数据库变化并转发给下游系统处理。本文以Flink on YARN为例,介绍如何在Debezium CDC 3.0中配置MySQL连接器,实现数据流处理。首先确保YARN上已部署Flink集群,接着安装Debezium MySQL连接器并配置Kafka Connect。最后,创建Flink任务消费变更事件并提交任务到Flink集群。通过这些步骤,可以构建出从数据库变更到实时处理的无缝数据管道。
1116 2
|
存储 消息中间件 数据采集
Flume 配置文件编写技巧(包会的,抄就完了)
本文介绍了Apache Flume的基础配置,包括数据源(Source)、数据通道(Channel)和数据处理器(Sink)三大部分。配置文件编写流程包括查阅官方文档、参考样例配置、实际操作配置。文章提供了一个经典例子,展示如何从本地端口收集数据并通过内存通道缓冲,最终记录到日志。配置流程包括声明组件、配置Source、Sink和Channel,然后将它们绑定。通过示例展示了如何配置HTTP Source和HDFS Sink,并给出了完整的配置文件示例及测试步骤,帮助读者理解Flume配置文件的编写。
1040 0
|
算法 分布式数据库 区块链
dapp交易所质押LP项目系统开发方案模式
区块链技术被认为是互联网发明以来最具颠覆性的技术创新,它依靠密码学和数学巧妙的分布式算法
|
JavaScript 前端开发 API
Vue.js框架简单读取数据库信息并渲染完成news新闻文章列表以及detail详情页功能(小试牛刀)
Vue.js框架简单读取数据库信息并渲染完成news新闻文章列表以及detail详情页功能(小试牛刀)
|
SQL 存储 数据挖掘
区块链数据探索:Bitcoin公链数据ETL
Bitcoin 公链可以理解为是一个公共的数据库,里面存储的是Bitcoin发布至今的所有转账记录,并且任何人只要接入到其网络中都可以获取,并不需要任何交易、挖矿、持币等相关操作。 本文主要主题的是将原始的Bitcoin公链数据进行清洗规整,写入到阿里云SLS,然后做一些有趣的数据处理,比如实现简洁的区块链浏览器、数据分析、交易链路追踪等。
1595 0
区块链数据探索:Bitcoin公链数据ETL
集成学习-幸福感预测案例分析
本次案例来源于天池的一个比赛,赛题使用 139 维的特征,使用 8000 余组数据进行对于个人幸福感的预测(预测值为1,2,3,4,5,其中1代表幸福感最低,5代 表幸福感最高)。以均方误差MSE为评价标准,因为评价标准为均方误差,所以使用回归问题的思路解决该问.
384 0
|
移动开发 监控 小程序
mPaaS小程序训练营,4天教你如何独立运行小程序!
随着小程序技术的愈发成熟,越来越多的业务模块通过小程序完成了改造,从而实现了「即开即用,即用即走」的流畅体验。 但与此同时,也随着业务方构建自有流量体系的诉求越来越迫切,实现“代码撰写一次,多端投放,覆盖自有 App、支付宝、钉钉”的能力,也变得迫在眉睫。
2456 0
mPaaS小程序训练营,4天教你如何独立运行小程序!
|
弹性计算 运维 安全
ECS使用体验
学校开设的课程是互联产品运维测试,也我是在学校第一次接触到在服务器上部署网页(html),当我第一次听到服务器三字的时候,我下意识想到“服务器?有什么作用,能用来干什么?是要钱的?贵不贵?我能不能承担起?”一系列问题,后来才知道这些问题都是多余的,经老师介绍我才知道阿里云服务器可以免费使用给大学生提供学习。学习的进行主要靠了“二软一网”即两个软件一个网站,我们在老师的讲解下分别使用Xftp 7与Xshell 7和阿里云开发者社区免费领到的服务器,三者搭配使用二软件用root管理权限登录。
|
机器学习/深度学习 Web App开发 安全

热门文章

最新文章