【数据结构-二叉树 八】【遍历求和】:求根到叶子节点数字之和

news2024/11/27 5:39:49

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【遍历求和】,使用【二叉树】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为:目标公司+最近一年+出现频率排序,由高到低的去牛客TOP101去找,只有两个地方都出现过才做这道题(CodeTop本身汇聚了LeetCode的来源),确保刷的题都是高频要面试考的题。

在这里插入图片描述
明确目标题后,附上题目链接,后期可以依据解题思路反复快速练习,题目按照题干的基本数据结构分类,且每个分类的第一篇必定是对基础数据结构的介绍

求根到叶子节点数字之和【MID】

DFS和BFS两种做法

题干

直接粘题干和用例在这里插入图片描述
在这里插入图片描述

解题思路

原题解地址,这道题中,二叉树的每条从根节点到叶子节点的路径都代表一个数字。其实,每个节点都对应一个数字,等于其父节点对应的数字乘以 10 再加上该节点的值(这里假设根节点的父节点对应的数字是 0)。只要计算出每个叶子节点对应的数字,然后计算所有叶子节点对应的数字之和,即可得到结果。可以通过深度优先搜索和广度优先搜索实现。

深度优先搜索DFS

深度优先搜索是很直观的做法。从根节点开始,遍历每个节点,如果遇到叶子节点,则将叶子节点对应的数字加到数字之和如果当前节点不是叶子节点,则计算其子节点对应的数字,然后对子节点递归遍历
在这里插入图片描述

广度优先搜索BFS

使用广度优先搜索,需要维护两个队列,分别存储节点节点对应的数字

  • 初始时,将根节点和根节点的值分别加入两个队列。每次从两个队列分别取出一个节点和一个数字,进行如下操作:
    • 如果当前节点是叶子节点,则将该节点对应的数字加到数字之和;
    • 如果当前节点不是叶子节点,则获得当前节点的非空子节点,并根据当前节点对应的数字和子节点的值计算子节点对应的数字,然后将子节点和子节点对应的数字分别加入两个队列。

搜索结束后,即可得到所有叶子节点对应的数字之和。
在这里插入图片描述
按照数值队列顺序加上了节点对应的值
在这里插入图片描述

代码实现

分别用DFS和BFS实现

DFS代码实现

给出代码实现基本档案

基本数据结构二叉树
辅助数据结构
算法递归
技巧

其中数据结构、算法和技巧分别来自:

  • 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树
  • 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法
  • 技巧:双指针、滑动窗口、中心扩散

当然包括但不限于以上

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int sumNumbers(TreeNode root) {
         return dfsSum(root, 0);
    }

    private int dfsSum(TreeNode node, int preIndex) {
        // 1 递归终止,越过叶子节点,返回0;
        if (node == null) {
            return 0;
        }
        // 2 计算到当前节点的数值
        int curValue = preIndex * 10 + node.val;

        // 3 判断当前节点是否为叶子节点,到叶子节点则返回叶子节点值,非叶子节点的和为左右子节点的和
        if (node.left == null && node.right == null) {
            return curValue;
        } else {
            return dfsSum(node.left, curValue) + dfsSum(node.right, curValue);
        }
    }
}

BFS代码实现

给出代码实现基本档案

基本数据结构二叉树
辅助数据结构队列
算法迭代
技巧

其中数据结构、算法和技巧分别来自:

  • 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树
  • 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法
  • 技巧:双指针、滑动窗口、中心扩散
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int sumNumbers(TreeNode root) {
       // 1 入参判断,如果root为空,返回0
        if (root == null) {
            return 0;
        }

        // 2 定义两个队列,一个为节点队列,一个为 节点值队列(用于存放当前节点为止的数字)
        Queue<TreeNode> nodeQueue = new LinkedList<TreeNode>();
        Queue<Integer> numQueue = new LinkedList<Integer>();
        nodeQueue.offer(root);
        numQueue.offer(root.val);

        // 3 借助队列进行层次遍历
        int sum = 0;
        while (!nodeQueue.isEmpty()) {
            // 3-1 处理队头元素,获取节点和截止当前节点的数值
            TreeNode curNode = nodeQueue.poll();
            int curValue = numQueue.poll();
            if (curNode.left == null && curNode.right == null) {
                // 到了叶子节点则只剩下节点值,累加即可
                sum += curValue;
            } else {
                // 如果左子节点不为空,则将左子节点入队,并且更新左子节点的截止数值
                if (curNode.left != null) {
                    nodeQueue.offer(curNode.left);
                    numQueue.offer(curValue * 10 + curNode.left.val);
                }
                // 如果右子节点不为空,则将右子节点入队,并且更新右子节点的截止数值
                if (curNode.right != null) {
                    nodeQueue.offer(curNode.right);
                    numQueue.offer(curValue * 10 + curNode.right.val);
                }
            }
        }

        return sum ;
    }

}

复杂度分析

  • 时间复杂度:O(N)。遍历了一遍二叉树,时间复杂度为O(N)
  • 空间复杂度:O(N)。DFS时 递归最差情况下时间复杂度为O(N),BFS时队列占用空间O(N)

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

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

相关文章

R语言 一种功能强大的数据分析、统计建模 可视化 免费、开源且跨平台 的编程语言

R语言是一种广泛应用于数据分析、统计建模和可视化的编程语言。它由新西兰奥克兰大学的罗斯伊哈卡和罗伯特杰特曼开发&#xff0c;并于1993年首次发布。R语言是一个免费、开源且跨平台的语言&#xff0c;它在统计学和数据科学领域得到了广泛的应用。 R语言具有丰富的数据处理、…

分享几个通用个人简历模板|行业通用

Home(https://cvjury.com/) 专业设计的简历模板。 在竞争激烈的就业市场中脱颖而出的有效策略。 侧重于向招聘人员传达独特的价值主张。 帮助创建引人注目的简历、求职信和LinkedIn资料。 面向毕业生和学生的个性化简历解决方案。 添加图片注释&#xff0c;不超过 140 字&…

Unity中Shader光强与环境色

文章目录 前言一、实现下图中的小球接受环境光照实现思路&#xff1a;1、在Pass中使用前向渲染模式2、使用系统变量 _LightColor0 获取场景中的主平行灯 二、返回环境中主环境光的rgb固定a(亮度)&#xff0c;小球亮度还随之改变的原因三、获取Unity中的环境光的颜色1、Color模式…

【力扣1812】判断国际象棋棋盘中一个格子的颜色

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述二、题目分析 一、题目描述 题目链接&#xff1a;判断国际象棋棋盘中一个格子的颜色 给你一个坐标 coordina…

基于SSM的商品营销系统计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

蓝桥杯每日一题2023.10.8

题目描述 七段码 - 蓝桥云课 (lanqiao.cn) 题目分析 所有的情况我们可以分析出来一共有2的7次方-1种&#xff0c;因为每一个二极管都有选择和不选择两种情况&#xff0c;有7个二极管&#xff0c;但是还有一种都不选的情况需要排除&#xff0c;故-1 枚举每个方案看是否符合要…

【VUE】element Table指定字段单元格样式及数据格式化

将列表中的指定字段的数据&#xff0c;根据字典值回显&#xff0c;并修改指定状态的显示样式 <el-tableref"table"height"500px":data"dataList"><template v-for"(item, index) in columns"><el-table-column:key&quo…

Docker的数据管理、端口映射和容器互联

目录 一、如何管理docker容器中的数据 1、数据卷 2、数据卷容器 二、端口映射 三、容器互联&#xff08;使用centos镜像&#xff09; 一、如何管理docker容器中的数据 管理 Docker 容器中数据主要有两种方式&#xff1a;数据卷&#xff08;Data Volumes&#xff09;和数据…

phpstudy本地域名伪静态

环境&#xff1a;WNMP(Windows10 Nginx1.15.11 MySQL5.7.26 【PHP 7.4.3 (cli) (built: Feb 18 2020 17:29:57) ( NTS Visual C 2017 x64 ) 】) 使用PhpStudy配置本地域名后&#xff0c;设置伪静态&#xff0c;这样在Web端打开网站就不需要输入index.php了&#xff0c;很简单…

2023年【A特种设备相关管理(锅炉压力容器压力管道)】新版试题及A特种设备相关管理(锅炉压力容器压力管道)试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;新版试题是安全生产模拟考试一点通生成的&#xff0c;A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;证模拟考试题库是根据A特种设备…

基于SSM+Vue的学习交流论坛的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Prometheus普罗米修斯

什么是Prometheus 官网&#xff1a;Overview | Prometheus 是一个开源的系统监控和警报工具&#xff0c;多数Prometheus组件是Go语言写的 为用户提供可视化仪表板、警报、告警等功能&#xff0c;以帮助用户快速定位和解决问题 现在已经成为一个独立于企业级的开源项目和一个…

【数据结构】树和二叉树概念及其结构

目录 一 树概念及结构 1 树的概念 2 树的相关概念 3 树的表示 二 二叉树概念及结构 1 概念 2 特殊二叉树 3 二叉树的性质 一 树概念及结构 1 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集…

Vue.js3学习篇--Vue组件的属性和方法

目录 一.属性和方法 1.属性基础 2.方法基础 二.计算属性和侦听器 1.计算属性 2.计算属性和函数的选择 3.计算属性的赋值 4.属性侦听 三.函数限流 四.表单数据的双向绑定 1.文本输入框 2.多行文本输入域 3.复选框和单选框 4.选择列表 5.两个常用修饰符 五.样式绑定…

【Verilog 教程】7.2 Verilog 文件操作

Verilog 提供了很多可以对文件进行操作的系统任务。经常使用的系统任务主要包括&#xff1a; 文件开、闭&#xff1a;$fopen, $fclose, f e r r o r 文件写入&#xff1a; ferror 文件写入&#xff1a; ferror文件写入&#xff1a;fdisplay, $fwrite, $fstrobe, f m o n i t…

无锡建筑模板厂家:选择适合无锡的建筑模板供应商

无锡作为江苏省的重要城市之一&#xff0c;建筑业发展迅猛&#xff0c;建筑模板作为建筑施工不可或缺的材料备受关注。在选择建筑模板时&#xff0c;考虑到无锡地区的经济状况、气候地形以及建筑风格等因素至关重要。除了常规的建筑模板材料&#xff0c;如建筑清水模板、建筑红…

【Redis】redis的特性和使用场景

Redis的特性 速度快基于键值对的数据结构服务器丰富的功能简单稳定客⼾端语⾔多持久化主从复制⾼可⽤&#xff08;HighAvailability&#xff09;和分布式&#xff08;Distributed&#xff09; 速度快 Redis 执⾏命令的速度⾮常快。 Redis 的所有数据都是存放在内存中的&…

Godot VisualStudio外部编辑器设置

文章目录 前言Godot visual studio 调试添加场景运行结果附加程序监听解决中文报错问题 Godot专栏地址 前言 Godot本质上只是一个游戏引擎&#xff0c;对C#只做了最小的适配&#xff0c;就是能打开&#xff0c;但是不能Debug。Godot支持许多外部编辑器&#xff0c;比如vs code…

MySql8.0 安装和启动

一、开发背景 需要存储数据&#xff0c;快速访问&#xff0c;这里选择 MySql&#xff0c;支持远程访问 二、开发环境 Window10 mysql-8.0.33-win64 三、实现步骤 1、下载压缩包 解压 网上找适合自己的版本&#xff0c;不建议使用32bit&#xff0c;MySql 对 32 bit 支持弱 参…

知识图谱系列3:读论文-《中国鸟类领域知识图谱构建与应用研究》-面向知识图谱的智能服务研究(需求、管理、查询、推理)

5.1鸟类领域知识服务需求研究 本部分根据不同人群&#xff0c;对其需求进行了研究。 并总结需求类型如下。 知识型服务需求指用户学习鸟类相关知识&#xff0c;包括知识内容、知识学习等。知识内容 需求为构建鸟类领域知识库作为知识的来源&#xff1b;知识学习需求为用户通过…