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

在这里插入图片描述

刷题

  • 1022.从根到叶的二进制数之和
    • 题目描述:
    • 思路一(dfs深搜万能版)
    • 思路二 (栈迭代巧解版)
    • 总结
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见!!!

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

题目描述:

在这里插入图片描述
题目给出一棵二叉树,我们需要统计计算每条路径的二进制之和。给出的测试用例是
1,0,1,0,1,0,1
则运算为:(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22。
难点就在于如何进行每个节点的储存计算,一般来说二叉树都会使用遍历或栈来进行运算。那就让我们来看看这个题如何完美解答吧!!!

思路一(dfs深搜万能版)

一般我们遇到二叉树都会想到遍历,但是这道题我们需要做到是如何记录该节点之前的数据,只有这样才能来进行每条路径的计算。所以首先我们需要单独写入一个函数来满足我们的需求
dfs(struct TreeNode* root ,int val)
其中root负责遍历,val来储存之前的数据,这样就可以进行操作了:
首先我们需要确定递归的返回条件,明确条思路才能顺畅解题!

  1. 如果二叉树为空 返回零
  2. 如果该节点为叶子节点 返回节点值与前面数据值 val 的和
  3. 如果不是叶子节点 返回左右二叉树的和 与 前面数据值 val 的和

确定了返回条件就简单了,把条件写好,剩下的交给计算机计算就OK了!!!

int dfs(struct TreeNode* root,int val){//如果二叉树为空 返回零if(root == NULL) return 0;//如果该节点为叶子节点 返回节点值与前面数据值 val 的和else if(!root->left&&!root->right) return (val << 1) | root->val;//相当于(val*2)+ root->val//如果不是叶子节点 返回左右二叉树的和与前面数据值 val 的和else{val = (val<<1) | root->val;//相当于(val*2)+ root->valreturn dfs(root->left,val) + dfs(root->right ,val);}
}
int sumRootToLeaf(struct TreeNode* root){return dfs(root,0);
}

这里之所以使用位操作而不是使用乘法操作,是因为使用位操作效率更高!乘法的底层是位运算乘法器,所以直接使用就避免了多余的操作。
来看运行结果:
在这里插入图片描述
直接秒天秒地秒世界!!!过啦!!!

思路二 (栈迭代巧解版)

该算法是使用栈来模拟函数递归的过程:

typedef struct TreeNode Node;int sumRootToLeaf(struct TreeNode* root){Node** stack = (Node*)malloc(sizeof(Node)*1001);Node* prev = NULL;int ret = 0;int val = 0,top = 0;while(root != NULL || top){while(root != NULL){stack[top++] = root;val = (val << 1)| root->val;root = root->left;}root = stack[top - 1];if(root->right == NULL || root->right == prev){if(root->right == NULL && root->left == NULL){ret += val;}val >>= 1;top--;prev = root;root = NULL;}else{root = root->right;}}free(stack);return ret;
}

选择遍历二叉树的办法是:

  1. 先创建一个指针 prev 用于储存上一个读取的节点
  2. 先在栈里储存二叉树左边的一条路径(一直 root = root->left)压栈
  3. 然后取出栈顶节点(root = stack[top-1])

接下来是非常关键的一步:
4. 如果该节点的右节点为空 或者 右节点已经遍历过了 就跳过 更替指针(prev = root;root = NULL)否则就进入root 右半树(root = root->right)
5. 循环执行2 - 4 就可以实现效果

只看代码还是十分难理解的,我使用图来简单解释一下:
在这里插入图片描述
就这样,一步一步进行就可以遍历整个树,是不是十分巧妙。结果自然是过啦!!!!
这种方法比较复杂,是非递归遍历二叉树的常用方法。

总结

通过这道题,我学会了递归的深度搜索方法,快速解决问题
也初步认识到了非递归遍历二叉树的方法。但还是不太理解,不知道是如何推出来的。

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

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

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

相关文章

SpringBoot 自定义注解实现操作日志记录

文章目录 前言正文一、项目结构介绍二、核心类2.1 核心注解2.1.1 CLog 日志注解2.1.2 ProcessorBean 处理器bean 2.2 切面类2.3 自定义线程池2.4 工具类2.4.1 管理者工具类 2.5 测试2.5.1 订单创建处理器2.5.2 订单管理者2.5.3 订单控制器2.5.4 测试报文2.5.5 测试结果 附录1、…

【Java题】调整奇数位于偶数之前(超简单版)

题目&#xff1a; 调整数组顺序使得奇数位于偶数之前。调整之后&#xff0c;不关心大小顺序。 如数组&#xff1a;[1,2,3,4,5,6,7,8,9] 调整后可能是&#xff1a;[1, 9,3,7,5, 6, 4, 8, 2] 代码&#xff1a; import java.util.Arrays;public class Main {public static voi…

将python程序打包为exe格式

1. 安装pyinstaller winr打开命令窗口 输入&#xff1a; pip install pyinstaller输入命令后会自动安装pyinstaller 2. 打包 进入你的代码所在位置&#xff0c;输入cmd 在弹出的窗口中输入 pyinstaller --onefile your_script.pyyour_script.py修改为你需要打包的程序名字 …

ElasticSearch架构介绍及原理解析

ElasticSearch架构介绍及原理解析文章目录 一、Elasticsearch是什么&#xff1f;1.简介2.历史与发展3.有关概念1.cluster2.shards3.replicas4.recovery5.river6.gateway7.discovery.zen8.Transport 4.安装 二、ElasticSearch架构介绍及原理解析1.基本架构1.1 进程节点1.2 负载均…

简述操作系统内存管理

这篇可是真枯涩啊&#xff0c;哈哈&#xff0c;老早在学操作系统的时候整理的文章&#xff0c;没加润色&#xff0c;单纯从个人网站迁移过来。 操作系统内存管理的目的是将线性物理地址用抽象的逻辑地址空间&#xff0c;从而保护物理地址。此外&#xff0c;可以独立地址空间&am…

07-Linux部署Nginx

Linux部署Nginx 简介 NGINX是一款高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。它的特点包括占用内存少、并发能力强&#xff0c;因此在处理高负载和高并发的场景时表现优秀。NGINX由俄罗斯的程序设计师Igor Sysoev开发&#xff0c;最初是为俄…

Windows Docker 部署 SQL Server

部署 SQL Server 打开 Docker Desktop&#xff0c;切换到 Linux 内核。然后在 PowerShell 执行下面命令&#xff0c;即可启动一个 SQL Server 服务&#xff0c;这里安装的是 2022 年版本 docker run -e "ACCEPT_EULAY" -e "MSSQL_SA_PASSWORDSQL123abcABC!&qu…

Spring 事务传播机制

事务传播机制&#xff1a;多个事务⽅法存在调⽤关系时, 事务是如何在这些⽅法间进⾏传播的。 ⽐如&#xff1a;有两个⽅法A&#xff0c;B都被 Transactional 修饰,&#xff0c;A⽅法调⽤B⽅法 A⽅法运⾏时, 会开启⼀个事务。当A调⽤B时&#xff0c; B⽅法本⾝也有事务&#xf…

59.仿简道云公式函数实战-文本函数-RMBCAP

1. RMBCAP函数 RMBCAP 函数可以将金额小写转换为人民币大写金额形式。 2. 函数用法 RMBCAP(数字) 3. 函数示例 如&#xff0c;在财务结算、报销管理、对公付款等场景中&#xff0c;可以利用 RMBCAP 函数将金额转换为大写&#xff0c;避免被篡改产生的负面影响 4. 代码实战…

Socket网络编程(一)——网络通信入门基本概念

目录 网络通信基本概念什么是网络&#xff1f;网络通信的基本架构什么是网络编程?7层网络模型-OSI模型什么是Socket&#xff1f;Socket的作用和组成Socket传输原理Socket与TCP、UDP的关系CS模型(Client-Server Application)报文段牛刀小试&#xff08;TCP消息发送与接收&#…

江科大stm32学习笔记——【5-2】对射式红外传感器计次旋转编码计次

一.对射式红外传感器计次 1.原理 2.硬件连接 3.程序 CountSensor.c: #include "stm32f10x.h" // Device header #include "Delay.h"uint16_t CountSensor_Count;void CountSensor_Init(void) {//配置RCC时钟&#xff1a;RCC_APB2Perip…

前端架构: 脚手架之包管理工具的案例对比及workspaces特性的使用与发布过程

npm的workspaces 特性 1 &#xff09;使用或不使用包管理工具的对比 vue-cli 这个脚手架使用 Lerna 管理&#xff0c;它的项目显得非常清晰在 vue-cli 中包含很多 package 点开进去&#xff0c;每一个包都有package.json它里面有很多项目&#xff0c;再没有 Lerna 之前去维护和…

SpringCloudNacos注册中心服务分级存储模型

文章目录 服务分级存储模型概述配置集群同集群优先的负载均衡 权重配置总结 之前对 Nacos注册中心入门 已经做了演示. 这篇文章对 Nacos 的服务分级存储模型做理论与实践. 服务分级存储模型概述 一个服务可以有多个实例&#xff0c;例如我们的 user-server&#xff0c;可以有:…

C#使用iText7给PDF文档添加书签

上一篇文章将SqlSugar官网文档中每个链接对应的网页生成独立PDF文档再合并为单个PDF文档&#xff0c;但是没有书签&#xff0c;八百多页的内容查找和跳转都不方便&#xff0c;本文学习和使用iText7给PDF文档添加多级书签。   添加多级书签分为两大步骤&#xff1a;1&#xff…

VR全景HDR拍摄教程

什么是HDR&#xff1f; HDR可以用在哪里&#xff1f; 书面解释&#xff1a;HDR&#xff08;高动态范围 High Dynamic Range&#xff09;摄影&#xff0c;是摄影领域广泛使用的一种技术。 是不是有点懵&#xff1f; 我们来看一个实际的拍摄现场环境&#xff0c;你就懂了 我们…

使用 Gradle 版本目录进行依赖管理 - Android

/ 前言 / 在软件开发中&#xff0c;依赖管理是一个至关重要的方面。合理的依赖版本控制有助于确保项目的稳定性、安全性和可维护性。 Gradle版本目录&#xff08;Version Catalogs&#xff09;是 Gradle 构建工具的一个强大功能&#xff0c;它为项目提供了一种集中管理依赖…

定时任务框架

定时任务的框架有哪些 ● Timer&#xff0c;JDK自带的&#xff0c;比较简单&#xff0c;使用的时候&#xff0c;定义一个TimerTask&#xff0c;实现run方法&#xff0c;然后定义一个Timer类&#xff0c;调用timer.schedule(timerTask,1000,3000); ○ 缺点&#xff1a;单线程、…

附加Numpy数组

参考&#xff1a;Append Numpy Array 引言 在数据科学和机器学习领域&#xff0c;处理大规模数据集是一项重要且常见的任务。为了高效地处理数据&#xff0c;numpy是一个非常强大的Python库。本文将详细介绍numpy中的一个重要操作&#xff0c;即如何附加&#xff08;append&a…

LeetCode:2867. 统计树中的合法路径数目(筛质数+ DFS Java)

目录 2867. 统计树中的合法路径数目 题目描述&#xff1a; 实现代码与思路&#xff1a; 筛质数 DFS 原理思路&#xff1a; 2867. 统计树中的合法路径数目 题目描述&#xff1a; 给你一棵 n 个节点的无向树&#xff0c;节点编号为 1 到 n 。给你一个整数 n 和一个长度为 …

西软云XMS operate XXE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…