华为OD机试真题B卷 Java 实现【二叉树的所有路径】,附详细解题思路

news2024/11/18 16:41:05

在这里插入图片描述

一、题目描述

给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。

二、思路与算法

最直观的方法是使用深度优先搜索。在深度优先搜索遍历二叉树时,我们需要考虑当前的节点以及它的孩子节点。
如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。
如果当前节点是叶子节点,则在当前路径末尾添加该节点后我们就得到了一条从根节点到叶子节点的路径,将该路径加入到答案即可。
如此,当遍历完整棵二叉树以后我们就得到了所有从根节点到叶子节点的路径。

四、解题思路

最直观的方法是使用深度优先搜索。在深度优先搜索遍历二叉树时,我们需要考虑当前的节点以及它的孩子节点。
如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。
如果当前节点是叶子节点,则在当前路径末尾添加该节点后我们就得到了一条从根节点到叶子节点的路径,将该路径加入到答案即可。
如此,当遍历完整棵二叉树以后我们就得到了所有从根节点到叶子节点的路径。

五、Java算法源码

public List<String> binaryTreePaths(TreeNode root) {
    List<String> list = new ArrayList<>();
    constructPaths(root, "", list);
    return list;
}
 
private void constructPaths(TreeNode root, String path, List<String> pathList){
    if (root != null){
        StringBuilder builder = new StringBuilder(path);
        builder.append(Integer.toString(root.val));
        if (root.left == null && root.right == null){//当前节点是叶子节点
            pathList.add(builder.toString()); //把路径加入到答案中
        }else {
            builder.append("->");//当前结点不是叶子结点,继续递归遍历
            constructPaths(root.left, builder.toString(),pathList);
            constructPaths(root.right, builder.toString(),pathList);
        }
    }
}

六、进阶写法可以使用栈来实现深度优先搜索

具体步骤如下:

  1. 将根节点压入栈中,同时将根节点对应的路径保存到另一个栈中;
  2. 当栈非空时,弹出栈顶节点以及对应的路径,并检查该节点是否为叶子节点;
  3. 如果是叶子节点,则将路径添加到结果列表中;
  4. 如果不是叶子节点,则将节点的孩子节点和对应的路径分别压入栈中。
public List<String> binaryTreePaths(TreeNode root) {
    List<String> list = new ArrayList<>();
    if (root == null) {
        return list;
    }
    Stack<TreeNode> nodeStack = new Stack<>();
    Stack<String> pathStack = new Stack<>();
    nodeStack.push(root);
    pathStack.push(Integer.toString(root.val));
    while (!nodeStack.isEmpty()) {
        TreeNode node = nodeStack.pop();
        String path = pathStack.pop();
        if (node.left == null && node.right == null) { // 叶子节点
            list.add(path);
        } else {
            if (node.right != null) {
                nodeStack.push(node.right);
                pathStack.push(path + "->" + Integer.toString(node.right.val));
            }
            if (node.left != null) {
                nodeStack.push(node.left);
                pathStack.push(path + "->" + Integer.toString(node.left.val));
            }
        }
    }
    return list;
}

🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

在这里插入图片描述

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

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

相关文章

DAY 77 [ Ceph ] 基本概念、原理及架构

前言 在实现容器化的初期&#xff0c;计划使用 Ceph 作为容器的存储。都说存储是虚拟化之母&#xff0c;相对容器来说&#xff0c;存储也起到了至关重要的作用。 选用 Ceph 作为容器化存储理由如下&#xff1a; 方便后期横向扩展&#xff1b;Ceph能够同时支持快存储、对象存…

MM32F3273G8P火龙果开发板MindSDK开发教程15 - 获取msa311加速器的方向改变事件

MM32F3273G8P火龙果开发板MindSDK开发教程15 - 获取msa311加速器的方向改变事件 1、功能描述 类似手机里横屏竖屏检测&#xff0c;当方向发生变化时&#xff0c;横屏竖屏自动切换。 当msa311方向改变时&#xff0c;会产生中断&#xff0c;然后从寄存器Reg 0x0C(Orientation _…

图解LeetCode——20. 有效的括号

一、题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类…

i.MX RT1010跨界MCU调试利器(FreeMASTER上手体验)

FreeMASTER是一款基于PC的免费工具&#xff0c;用于可视化和调试嵌入式实时应用程序。它可以帮助开发人员快速实现深入嵌入式系统的数据测试和调试&#xff0c;它为嵌入式系统设计师提供了一个强大的、可视化的调试环境&#xff0c;在调试、验证和追踪实时应用程序时尤其有用。…

Atair 柱状比例图

如何熟练掌握可视化库和应对使用过程的疑难问题&#xff1f; 基本用法不妨访问 GeeksforGeeks 疑难问题优先搜索 https://stackoverflow.com 尽量使用官方文档&#xff1a; numpy的学习访问 https://numpy.org/doc/stable/user/index.html 例如&#xff1a; 一则 altair 使用过…

@antv/g2plot 特殊 散点图 x轴为category 调整了legend 的marker

下面代码演示了如何使用 antv/g2plot 创建一个散点图&#xff0c;并对其进行基本的样式和布局配置。 具体来说&#xff0c;代码中的 data 数组定义了散点图的数据系列&#xff0c;每个数据对象包含了分类、值和 y 轴字段三个属性。而 cateMap 对象则定义了每个分类对应的颜色和…

玩转ChatGPT:名单排序

一、写在前面 最近在文秘工作中&#xff0c;碰到一个名字排序的问题&#xff0c;大概的规则&#xff1a; &#xff08;1&#xff09;按照第一个汉字的首字母的英文单词排序&#xff0c;从A-Z&#xff1b; &#xff08;2&#xff09;若第一个字的首字母一致&#xff0c;则比较…

【920信号与系统笔记】第三章 连续信号的正交分解

连续信号的正交分解 3.1引言3.3信号表示为傅里叶级数(FS)三角傅里叶级数1. 本质展开式1展开式2展开条件-狄利克雷条件分量概念补充 指数傅里叶级数使用条件形式1&#xff08;按连续信号的正交分解定义展开&#xff09;形式2&#xff08;由三角函数形式的傅里叶级数推导&#xf…

力扣笔记(每日随机一题)——最佳买卖股票时机含冷冻期

问题&#xff08;中等&#xff09; 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;: 卖出股票后&a…

Unity HybridCLR + Xlua + Addressable 要点记要

接入缘由 老工程原本是C#&#xff0c;想做热更&#xff0c;于是接入了Xlua和Addressable。由于工程老&#xff0c;人手也不够&#xff0c;只是新代码使用Xlua&#xff0c;老功能&#xff08;尤其是核心战斗还是C#&#xff09;。大半年后觉得并不能达到预期需求。于是通过再接入…

vue-element-admin项目学习笔记(4)路由分析二:动态路由及permission.js

路由模块非常重要&#xff0c;自己基于这个框架进行开发&#xff0c;这个必须吃透&#xff01;&#xff01; 前情回顾&#xff1a; vue-element-admin项目学习笔记&#xff08;1&#xff09;安装、配置、启动项目 vue-element-admin项目学习笔记&#xff08;2&#xff09;main.…

改KendoReactUI组件,实现多个子元素的样式不一样

before after 问题描述 使用KendoReact RadioButton 组件&#xff0c;当用户选中当前项时需要显示不同颜色&#xff0c;试图通过找到KendoUI中对应的class name&#xff0c;然后修改这个class name下面的css来达到目的&#xff0c;但不起作用解决办法 用js控制style核心代码 …

华为OD机试之查找众数及中位数(Java源码)

查找众数及中位数 题目描述 众数是指一组数据中出现次数量多的那个数&#xff0c;众数可以是多个。 中位数是指把一组数据从小到大排列&#xff0c;最中间的那个数&#xff0c;如果这组数据的个数是奇数&#xff0c;那最中间那个就是中位数&#xff0c;如果这组数据的个数为偶…

从0开始搭建react项目(函数组件)

目录 项目搭建步骤 本地开发环境 脚手架构建项目 关联Git仓库 strictMode 严格模式 路由配置 路由传参 路由守卫 数据绑定 生命周期 父子组件通信 redux持久化 安装Sass 安装postcss-pxtorem&#xff08;移动端项目&#xff09; 安装axios 环境变量 本地代理 …

直播预告:CoremailHVV经验分享与重保整体解决方案发布

面对更具有目的性、针对性的网络攻击压力&#xff0c;重保既是抵抗攻击的重要举措&#xff0c;也是数字经济时代下企业发展的刚需。 正值重保期&#xff0c;企业在面对多样化的攻击手段、持续化的攻击行为、剧增化的攻击危害&#xff0c;应该如何应对重保大考&#xff1f; 6月1…

供应链安全

供应链安全 目录 文章目录 供应链安全目录本节实战可信任软件供应链概述构建镜像Dockerfile文件优化镜像漏洞扫描工具&#xff1a;Trivy检查YAML文件安全配置&#xff1a;kubesec准入控制器&#xff1a; Admission Webhook准入控制器&#xff1a; ImagePolicyWebhook关于我最后…

openpnp - 底部相机支架的制作

文章目录 openpnp - 底部相机支架的制作概述END openpnp - 底部相机支架的制作 概述 前几天总结了底部相机校验通不过的原因(openpnp - 底部相机矫正(subject not found)的原因总结), 并且可以校验通过了. 好景不长, 在校验通过的第三天(中间再穿插做其他事情), 从头做了一次…

【ArcGIS Pro二次开发】(38):清理字段值(空格、空值)

由于一些不规范的输入&#xff0c;或是其它数据转换而来&#xff0c;要素类或者独立表的字段值经常含有空值、空格等影响数据质量的内容。 这个工具的目的就是清理、转换这些字段内容&#xff0c;提高数据质量。 一、要实现的功能 如上图所示&#xff0c;点击【清洗字段值】按…

springboot+vue+java仓库管理系统_0r36w

部门管理员&#xff1a; 申购入库&#xff1a;发起申购&#xff0c;进行入库申请。 调拨申请&#xff1a;发起资产调拨的申请以及查看申请的详情信息。 出库管理&#xff1a;查看调拨的详情信息&#xff0c;可以进行资产的申请报废以及申请维修。 资产报废查询&#xff1a;查看…

薛定谔maestro 安装

【1】先删除之前不能用的文件包 【2】tar -xvf 解压包 进行解压 【3】cd 解压出来的文件下 【4】sudo ./INSTALL 【也可以不用sudo&#xff0c;我的电脑不知道上面问题&#xff0c;需要用sudo&#xff0c;否则在之后创建生成文件夹的时候没有权限】 【5】根据操作一步一步…