1. 问题描述:

给你一棵以 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
解释:树中蓝色的节点构成了与链表对应的子路径。

示例 2:

输入:head = [1,4,2,6], root = [1,4,4,null,2,2,null,1,null,6,8,null,null,null,null,1,3]
输出:true

示例 3:

输入:head = [1,4,2,6,8], root = [1,4,4,null,2,2,null,1,null,6,8,null,null,null,null,1,3]
输出:false
解释:二叉树中不存在一一对应链表的路径。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/linked-list-in-binary-tree

2. 思路分析:

① 对于树的相关题目我们基本上是可以使用递归来实现的,对于这道题目来时也是如此,一个比较容易想到的想法是先遍历整棵二叉树,在遍历的过程中找到树中节点中等于链表中第一个元素的节点,所以我们需要声明一个List<TreeNode>类型的数据结构将递归遍历到的结果加入到这个List结构中

② 在for循环中我们将对上面递归得到的结果中的节点作为起点进行递归,因为是链表遍历起来不方便所以我们在开始的时候将链表中所有的值加入到List中,这样在递归的时候与树中的节点进行一一比对的话就很方便,我们从起点开始,当发现当前的值与链表中List对应的值相等的时候才往下进行递归,这个也是一个很好的剪枝过程,模拟的是形成符合条件的路径,递归的过程中一一比对对应位置的值,所以当发现当前的值与List对应位置的值不相等的时候那么就不用往下递归了,所以需要在方法中需要传入一个参数来记录目前相等的结果有多少个了,递归的出口判断当前得到的数字相等的数量是否等于了链表元素的数量,如果相等了那么返回true即可,所以我们在递归的过程中假如发现有一条的路径为true直接那么可以返回true了,因为只存在一条路径就符合条件了,在领扣之前的题目也遇到过类似的,像79题单词搜索,只要找到一个单词那么就直接返回true了,所以只要有一个满足条件对于有返回值的递归方法来说可以判断出当前递归下去的结果是什么假如发现true了那么就会层层返回了,就不用再尝试其他的结果了

3. 代码如下:

class Solution {public boolean isSubPath(ListNode head, TreeNode root) {/*将链表元素放到List中*/dfs(root, head.val);List<Integer> listRec = new ArrayList<>();ListNode h = head;while (h != null){listRec.add(h.val);h = h.next;}for (int i = 0; i < list.size(); ++i){boolean r = find(list.get(i), listRec.size(), 0, listRec);if (r) return true;}return false;}private boolean find(TreeNode treeNode, int size, int cur, List<Integer> listRec) {if (size == cur) return true;if (treeNode == null) return false;if (listRec.get(cur) == treeNode.val){boolean l = find(treeNode.left, size, cur + 1, listRec);if (l) return true;boolean r = find(treeNode.right, size, cur + 1, listRec);if (r) return true;}return false;}/*先使用dfs找到根节点然后调用另外的递归方法检查是否满足条件*/List<TreeNode> list = new ArrayList<>();private void dfs(TreeNode root, int headVal) {if (root == null) return;if (root.val == headVal) list.add(root);if (root.left != null) dfs(root.left, headVal);if (root.right != null) dfs(root.right, headVal);}
}

1367 二叉树中的列表(递归)相关推荐

  1. 1367. 二叉树中的列表

    1367. 二叉树中的列表 原始题目链接:https://leetcode-cn.com/problems/linked-list-in-binary-tree/ 给你一棵以 root 为根的二叉树和 ...

  2. LeetCode 1367. 二叉树中的列表(双重递归)

    1. 题目 给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表. 如果在二叉树中,存在一条一直向下的路径,且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值,那么请你 ...

  3. 1367 二叉树中的列表

    题目描述: 给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表. 如果在二叉树中,存在一条一直向下的路径,且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值,那么请你 ...

  4. Leetcode1367.二叉树中的列表

    1367:二叉树中的列表 题目 思路一 思路二 题目 给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表. 如果在二叉树中,存在一条一直向下的路径,且每个点的数值恰好一一对应以 h ...

  5. 14.相同的树另一棵树的子树检查子树二叉树中的列表(教你们使用相同的套路快速解决这四道题)

    一.相同的树 这道题是开胃菜的开始,使用递归进行解决 递归三部曲: 确定递归函数的参数和返回值 因为我们要比较的是两棵树是否相等,所以参数分别是两棵树的根节点,返回值为boolean类型,即两棵树是否 ...

  6. 线索二叉树中序非递归线索化以及递归线索化构建和遍历算法

    引文 大部分教材给出了 线索二叉树的中序递归线索化以及中序遍历,但是没给出非递归,现在网上大部分非递归算法代码各种条件判断写的比较离谱,所以干脆自己总结了一个清晰的.线索二叉树中序非递归线索化以及递归 ...

  7. 数据结构二叉树中序遍历递归和非递归算法

    2022.11.19 二叉树中序遍历递归和非递归算法 任务描述 相关知识 编程要求 测试说明 C/C++代码 任务描述 本关任务:给定一棵二叉树,使用递归和非递归的方法实现二叉树的中序遍历结果. 相关 ...

  8. 二叉树中序非递归遍历

    递归是程序设计中强有力的工具.递归函数结构清晰,使程序易读.但递归函数也有不可克服的弱点,时间.空间效率较低,运行代价较高,所以在实际使用中,常希望使用它的迭代版本.为了实现非递归遍历算法,需要一个堆 ...

  9. leetcode算法题--二叉树中的列表★

    原题链接:https://leetcode-cn.com/problems/linked-list-in-binary-tree/ 嵌套递归 bool isSubPath(ListNode* head ...

最新文章

  1. Struts1.2的框架验证
  2. 聊聊flink的ConnectionManager
  3. sql已经完成,生成表
  4. java学习(二)--- 变量类型
  5. Ethereum Bootstrap 以太坊本地私有链开发环境搭建
  6. mysql show slave status 无记录_Mysql show slave status 的研究
  7. .NET 5 和 C#9 /F#5 一起到来, 向实现 .NET 统一迈出了一大步
  8. hdu 5299——Circles Game
  9. socket初级使用(客户端)
  10. 关于增强学习你应该了解的五件事儿
  11. php终止符,关于php中嵌入html代码时结束符“?”位置为什么这样放置?
  12. iOS Class结构分析
  13. 【Gitlab】GIT回滚master分支到指定tag版本 并提交远程仓库
  14. 全能直播王pc版_企鹅游戏直播助手v2.28.330.8-企鹅游戏直播助手PC版下载
  15. 剑指offer.数值的整数次方
  16. iOS 离屏渲染的研究
  17. jquery读取table的内容
  18. kaptcha生成java验证码
  19. 一篇搞懂Git 和 SVN 的区别
  20. 更改dockers的host文件中的ip,当主机ip改变时,dockers无法启动。

热门文章

  1. 水源热泵系统的优点和缺点有哪些?
  2. 魔方(6)三阶空心魔方、二阶空心魔方
  3. SpringMVC返回数据到页面的方法
  4. vue的页码组件的页码重置为1
  5. word2vec思考:word2vec为什么不使用非线性激活函数?
  6. git 删除远程仓库中的文件(夹)
  7. The Thirty-fifth Of Word-Day
  8. Python中利用Opencv进行车牌号检测
  9. 网络技能大赛-2018年国赛真题[2018年全国职业技能大赛高职组计算机网络应用赛项真题-I卷]路由交换部分答案详解
  10. android应用间相互调用