二叉树中的列表

2023-11-03

leetcode

二叉树中的列表

给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表。

如果在二叉树中,存在一条一直向下的路径,且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值,那么请你返回 True ,否则返回 False 。

一直向下的路径的意思是:从树中某个节点开始,一直连续向下的路径。

实例 1:

输入:head = [4,2,8], root = [1,4,4,null,2,2,null,1,null,6,8,null,null,null,null,1,3]
输出:true
解释:树中蓝色的节点构成了与链表对应的子路径。

解法:递归法

基本思路: 其实思路很简单,我们要在二叉树中找到一条自上到下的路径,该路径上的结点的值跟链表的值都相同,我们可以使用递归来解决这个问题,当当前结点的值跟链表结点的值相同时,我们就对链表下一个结点的值跟树的左右孩子结点比较,只要左右孩子有一个比较成功,那就可以说明匹配成功了,如果匹配不成功,那就对以左右孩子为根结点的树重新进行匹配,直到所有结点匹配完,进行匹配的函数为isSub

return isSub(head, root) || isSubPath(head, root.left) || isSubPath(head, root.right);
//只要一个成立,就能说明匹配成功,所以用||操作

递归出口:使用递归要明确递归出口,那递归出口应该是什么?递归出口就是结点为空或者链表为空时,当结点为空,说明树的结点都遍历完了,那还没匹配到的话,就可以返回false了,当链表为空时,说明链表匹配完了,那就可以返回true

if(head == null)
    return true;
if(root == null)
    return false;

完整代码

class Solution {
    public boolean isSubPath(ListNode head, TreeNode root) {
        if (head == null) {
            return true;
        }
        if (root == null) {
            return false;
        }
        //先判断当前的节点,如果不对,再看左子树和右子树
        return isSub(head, root) || isSubPath(head, root.left) || isSubPath(head, root.right);
    }

    private boolean isSub(ListNode head, TreeNode node) 
    //匹配函数就是让树的结点跟子节点一起往下遍历,只要一个不匹配,就返回false
    {
        if(head == null)
            return true;
        if node == null) 
            return false;
        if (head.val != node.val) 
            return false;
        //这里直接就剪枝了,但是你不用担心后面的子树是否有符合匹配条件的被剪掉了,
        在isSubPath函数里面对所有子树都调用了isSub匹配函数
        return isSub(head.next, node.left) || isSub(head.next, node.right);
    }
}

注意:该代码是互相递归的,可能一开始看起来有点懵


该解法来源于:

作者:jerry_nju

链接:https://leetcode-cn.com/problems/linked-list-in-binary-tree/solution/zhe-ti-jiu-shi-subtreeyi-mao-yi-yang-by-jerry_nju/

来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我自己的解法是:

class Solution {
    public boolean isSubPath(ListNode head, TreeNode root) {
        return isSubPath(head,root,head);
    }
    public boolean isSubPath(ListNode head, TreeNode root, ListNode NextNode)
    {
        if(NextNode==null)
            return true;
        if(root==null)
            return false;
        //递归退出条件是一样的
        if(root.val!=NextNode.val) //当当前结点的值跟链表的值不相同时,就要对链表重头开始遍历
        {
            boolean l = isSubPath(head,root.left,head);
            boolean r = isSubPath(head,root.right,head);
            return l||r;
        }
        else
        {
            boolean l = isSubPath(head,root.left,NextNode.next);
            boolean r = isSubPath(head,root.right,NextNode.next);
            return l||r;
        }
    }
}

这个解法我觉得是没有问题的,但是就在一个特殊的案例就通不过,我也没啥办法

心得体会

我之前刷了十几道动态规划的题,感觉动态规划是最难的,二叉树还行,思路很快就能出来了,只要实现就行,但是动态规划就是看题看很久都没有半点思路,所以我先不练动态规划了,先刷一下树的题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉树中的列表 的相关文章

随机推荐

  • Mongo可视化工具studio 3t无限试用

    文章目录 前言 一 下载 二 使用步骤 1 下载后 无脑下一步安装好 2 开始无限试用 总结 前言 mongodb可以说是比较流行的nosql数据库了 它灵活多变的存储 为项目中后续可能的变更提供了极大的便利性 工欲善其事必先利其器 今天推
  • teamviewer安装商业不能链接的解决办法重装()

    安装商业不能链接的解决办法重装 解决办法如下 1 卸载teamviewer 可以通过控制面板或者第三方管理软件卸载 2 Windows R后输入regedit打开注册表 通过Ctrl F调出搜索框 搜索所有的teamviewer关键字 把搜
  • TypeError: write() argument must be str, not bytes报错原因及解决方法

    img data requests get url url content fill Name str i png with open fill Name w as fp fp write img data 问题描述 想用write写入图片
  • 【编译原理】【C语言】实验三:递归下降分析法

    C语言 实验环境 Visual Studio 2019 author zoxiii 递归下降分析法 1 实验内容 2 前期准备 2 1 递归下降分析法原理 2 2 要实现的文法 2 3 需要的函数 3 分析过程 3 1 递归下降分析法设计思
  • 51单片机【三】静态与动态驱动数码管

    数码管结构及分类 数码管是发光器件之一 内部由七个条形发光二极管 a b c d e f g 和一个小圆点发光二极管 dp 构成 51单片机开发板上为八段数码管 如下图所示 根据各段的组合不同 显示的字符也就不同 按八个数码管的公共端接线不
  • 信号量--同步和异步的区别

    同步 同步操作类似于 等待通知 当一个进程或线程执行同步操作时 它会等待某个特定的条件或事件发生 然后才继续执行 在信号量中 同步操作可能包括等待某个信号量的值达到特定的状态 或者等待其他进程完成特定的任务 然后再继续执行 同步操作保证了进
  • 数仓工具Hive 概述

    Hive Hive简介 Hive架构 HiveSQL语法不同之处 建表语句 查询语句 Hive查看执行计划 Hive文件格式 Hive简介 Hive是由Facebook开源 基于Hadoop的一个数据仓库工具 可以将结构化的数据文件映射为一
  • vscode代码调整快捷键_21 个VSCode 快捷键,让代码更快,更有趣

    注意 本身尝试的时候 Mac 17 pro 与原文提供的快捷键盘不太同样 mac 对应的 Ctrl 要换成 commandgithub 作为前端开发者来讲 大都数都用过 VSCode 而且也有不少是常常用的 但 VSCode 的一些快捷键可
  • 日本企業の開発管理仕事するときに発生した問題のまとめ。

    上司 交流 工数 要求 必 出来上 日数 多 工数 要求 念 十分 時間 重要 保守任務 受 取 工数要求 前 必 完全状態 確認 断然 断 前回 保守 開発 確認 上司 要求 VSS中 保存 日本 側 転送 前 再 念 完全状態 再 確認
  • K—means(K-均值聚类算法)

    K means算法简介 K means是一种无监督的聚类算法 其中的k代表类簇个数 means代表类簇内数据对象的均值 这种均值是一种队类簇中心的描述 K means算法以距离作为数据对象间相似度的衡量标准 即数据对象间的距离越小 则它们的
  • 2018高中计算机会考时间,2018高中会考时间安排_2018年高中会考什么时候考哪些科目...

    www okfie com 北京 高中会考的成绩关系到我们的高中毕业证 因此我们要对会考做好准备 以下是烟花美文网小编为你整理的2018年高中会考的相关信息 希望能帮到你 2018年高中会考时间 会考时间每一个省都是不同的 有的省只考一次
  • CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://mirrors.tuna.tsinghua.edu.cn/anaconda/pk

    我是在配置Anaconda环境的时候出现的问题 conda create n py39 python 3 9 一般是配置清华镜像源之后出现的问题 解决方案 C Users 用户名 目录下找到 condarc文件 建议直接复制以下内容替换文件
  • 边开火边移动

    作者 周思博 Joel Spolsky 译 Paul May 梅普华 原文链接 英文 我总会有时候什么事都做不了 我当然还是会去上班 不过却是到处闲逛 每10秒就收一次信 逛逛网站 甚至做些付信用卡帐单之类不用动脑的事 就是没法子进入状况回
  • SpringBoot 2.0 中 HikariCP 数据库连接池原理解析

    作为后台服务开发 在日常工作中我们天天都在跟数据库打交道 一直在进行各种CRUD操作 都会使用到数据库连接池 按照发展历程 业界知名的数据库连接池有以下几种 c3p0 DBCP Tomcat JDBC Connection Pool Dru
  • 分布式消息队列RocketMQ 快速入门

    分布式消息队列RocketMQ 一 RocketMQ概述 概述 1 MQ简介 MQ Message Queue 是一种提供消息队列服务的中间件 是一套提供了消息生产 存储 消费全过程API的软件系统 2 MQ用途 限流削峰 MQ可以将系统的
  • qt: 系统默认程序打开文件或者软件;

    Qt提供了QDesktopServices类 可以利用openUrl函数调用默认程序打开文件 源码参考 ifdef Q OS WIN32 m szHelpDoc QString file m szHelpDoc bool is open Q
  • 购物车中的Ajax技术应用

    精选30 云产品 助力企业轻松上云 gt gt gt 目录 1 前言 2 Ajax基本原理 3 JQuery发送HTTP请求的常用方式 3 1 get 请求实现异步加载 3 2 post 请求实现异步加载 3 3 ajax 请求实现异步加载
  • c语言输入一个五位数,判断是否为回文数

    输入一个五位数 判断是否为回文数 include
  • 【深入理解计算机系统】第一章重点汇总

    当前有如下程序 hello c include
  • 二叉树中的列表

    leetcode 二叉树中的列表 给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表 如果在二叉树中 存在一条一直向下的路径 且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值 那么请你返回 True 否则