news 2026/5/8 15:26:58

力扣1367:二叉树中查找链表路径

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
力扣1367:二叉树中查找链表路径

问题解构

力扣第1367题“二叉树中的列表”要求判断一个给定的链表是否在二叉树中作为一条自上而下的路径存在。这意味着需要在二叉树中寻找一条路径,其节点值依次与链表节点的值完全匹配,且路径方向必须是从父节点到子节点(可以跳过中间节点,但方向必须一致)。

核心约束

  1. 链表节点值必须与二叉树路径节点值顺序、值完全一致。
  2. 路径必须是自上而下的,即从某个二叉树节点开始,只能向子节点方向移动(左子或右子)。
  3. 链表可以是二叉树路径的一部分,即链表结束时,二叉树路径可以还有后续节点(题目要求链表是路径的“一部分”,但根据常见理解及测试用例,通常要求路径节点数至少等于链表长度,且值序列完全匹配链表。更严谨地说,是判断二叉树中是否存在一条从上到下的路径,其节点值的顺序与链表节点的值顺序完全相同)。

方案推演

解决此问题通常采用深度优先搜索(DFS)配合递归的策略。核心思路是遍历二叉树的每个节点,并以该节点为起点,尝试匹配整个链表。

可以设计两个递归函数:

  1. 主递归函数dfs(root, head):遍历二叉树,对每个节点,调用辅助函数判断是否从该节点开始能匹配链表。
  2. 辅助递归函数isSubPath(head, root):判断从当前二叉树节点root开始,是否能匹配以head开头的链表。

递归终止条件

  • 如果链表指针head为空,说明链表已全部匹配完成,返回true
  • 如果二叉树节点root为空,但链表节点还有剩余,说明路径已无法继续,返回false
  • 如果当前二叉树节点值root.val不等于链表节点值head.val,则从当前起点匹配失败,返回false

递归过程
在辅助函数中,若当前节点值匹配,则继续递归判断左子树或右子树是否能匹配链表的下一个节点。在主函数中,需要检查当前节点为起点是否能匹配,或者左/右子树中是否存在匹配。

代码实现

以下是基于上述思路的 Python 代码实现:

# Definition for singly-linked list. class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next # Definition for a binary tree node. class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right class Solution: def isSubPath(self, head: ListNode, root: TreeNode) -> bool: """ 主函数:判断链表head是否在二叉树root中作为一条自上而下的路径存在。 """ if not head: return True # 空链表视为存在于任何树中 if not root: return False # 空树不可能包含非空链表 # 以当前root为起点尝试匹配,或在左/右子树中继续寻找起点 return self.dfs(head, root) or \ self.isSubPath(head, root.left) or \ self.isSubPath(head, root.right) def dfs(self, head: ListNode, root: TreeNode) -> bool: """ 辅助函数:判断从二叉树节点root开始,是否能匹配以head开头的链表。 """ # 链表已全部匹配完成 if not head: return True # 二叉树节点为空,无法继续匹配 if not root: return False # 当前节点值不匹配,失败 if head.val != root.val: return False # 当前节点匹配成功,继续匹配链表的下一个节点与当前节点的左子节点或右子节点 return self.dfs(head.next, root.left) or self.dfs(head.next, root.right)

算法解析

时间复杂度分析

  • 最坏情况下,需要遍历二叉树的每个节点(N个),对每个节点都可能执行一次dfs匹配,而dfs匹配的长度最多为链表长度M
  • 因此,最坏时间复杂度为O(N × M),其中 N 是二叉树节点数,M 是链表长度。
  • 平均情况会好于最坏情况,因为并非每个节点都需要完整匹配整个链表。

空间复杂度分析

  • 空间复杂度主要取决于递归调用栈的深度。
  • 在最坏情况下(树退化为链表),递归深度为N,因此空间复杂度为O(N)

关键点说明

  1. 双重递归:主函数isSubPath用于遍历二叉树寻找匹配起点,辅助函数dfs用于从特定起点开始匹配链表,两者结合覆盖了所有可能的路径起点和匹配过程 。
  2. 匹配方向dfs函数中只向root.leftroot.right递归,保证了路径是自上而下的,不会回溯到父节点。
  3. 短路优化:主函数中使用or连接三个递归调用,利用短路特性,一旦找到匹配立即返回true,减少不必要的计算。

示例演示

假设链表为1 -> 4 -> 2 -> 6,二叉树如下:

1 / \ 4 4 / \ \ 1 2 6 / / \ \ 8 1 3 7

匹配过程

  1. 从根节点1开始匹配,链表头1匹配成功,进入dfs
  2. dfs(4, 节点4):链表节点4与二叉树左子节点4匹配成功。
  3. dfs(2, 节点2):链表节点2与二叉树节点2匹配成功。
  4. dfs(6, 节点6):链表节点6与二叉树节点6匹配成功。
  5. 链表结束,返回true

因此,该链表存在于二叉树中作为一条路径(路径为1 -> 4 -> 2 -> 6)。

边界情况处理

边界情况处理方式说明
链表为空直接返回true空链表视为存在于任何树中
二叉树为空直接返回false空树不可能包含非空链表
链表节点值不匹配当前起点匹配失败,尝试其他起点dfs中立即返回false,主函数尝试其他分支
链表长度大于路径深度匹配失败dfs中二叉树节点先于链表变为空时返回false

与其他相似问题的对比

题目核心问题解法差异关键点
1367. 二叉树中的列表判断链表是否为二叉树中自上而下的路径双重递归,匹配链表节点序列路径必须连续向下,值顺序严格匹配
面试题 04.10. 检查子树判断一棵树是否为另一棵树的子树递归比较树结构(节点值和左右子树)需要整个子树结构完全一致,包括所有后代节点
572. 另一棵树的子树类似上题,判断子树相同,递归比较树结构子树必须从某个节点开始完全匹配

通过以上分析,力扣1367题的解决方案清晰且高效,通过双重递归实现了对二叉树中链表路径的精确匹配。


参考来源

  • LeetCode题解汇总
  • LeetCode题解及源码汇总
  • Leetcode题解索引
  • 双递归二叉树 力扣1367二叉树中的列表 面试题04.10检查子树
  • [LeetCode 1365~1368][周赛]周赛178题解
  • 递归算法——Leetcode题型总结(1)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 15:25:28

为什么传统网盘下载方法失效?三个技术视角下的创新解决方案

为什么传统网盘下载方法失效?三个技术视角下的创新解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 /…

作者头像 李华
网站建设 2026/5/8 15:25:18

基于MCP协议构建AI图像生成工作流:从原理到实践

1. 项目概述:一个为AI图像生成注入灵魂的“工作室”如果你和我一样,长期在AI图像生成的圈子里摸爬滚打,那你一定经历过这样的困境:Midjourney、Stable Diffusion这些工具确实强大,但每次想生成一张符合特定风格、精确构…

作者头像 李华
网站建设 2026/5/8 15:25:13

从三明治专利到商业帝国:技术洞察与知识产权战略的跨界启示

1. 从“荒谬”到“印钞机”:一个三明治专利的商业化启示录周五的下午,我习惯性地翻看那些让人啼笑皆非的专利文件。大多数时候,这些所谓的“发明”都像是发明家们一时兴起的脑洞产物,除了博人一笑,几乎看不到任何商业化…

作者头像 李华
网站建设 2026/5/8 15:25:13

构建Visa支付沙盒:安全测试网关的设计、部署与实战

1. 项目概述:一个面向开发者的支付安全沙盒最近在和一些做独立开发的朋友聊天,发现大家在做涉及支付功能的应用时,普遍面临一个头疼的问题:测试环境。无论是电商平台、订阅服务还是内容付费应用,支付环节的测试总是束手…

作者头像 李华
网站建设 2026/5/8 15:25:04

如何高效获取网页媒体资源:专业捕获工具完整指南

如何高效获取网页媒体资源:专业捕获工具完整指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾经在浏览网页时遇到想要保存的…

作者头像 李华