Bootstrap

Python 1367. 二叉树中的链表

题目:1367. 二叉树中的链表

思路:

  1. 从head 链表深度找,知道使用深度优先遍历dfs
  2. 从root里面对head进行匹配,如果当前两者匹配或是左右子树匹配
class Solution:
    def isSubPath(self, head: Optional[ListNode], root: Optional[TreeNode]) -> bool:
        # 检查从当前树节点 t 是否可以匹配链表 s
        def dfs(s: Optional[ListNode], t: Optional[TreeNode]) -> bool:
            if not s:  # 链表匹配完成
                return True
            if not t:  # 树节点为空,匹配失败
                return False
            if t.val != s.val:  # 当前值不匹配
                return False
            # 检查左右子树是否能继续匹配链表的下一个节点
            return dfs(s.next, t.left) or dfs(s.next, t.right)

        # 主函数:检查从树的每个节点出发是否可以匹配链表
        if not head:  # 链表为空,直接返回 True
            return True
        if not root:  # 树为空,无法匹配
            return False
        # 从当前节点匹配,或者从左右子树开始匹配
        return dfs(head, root) or self.isSubPath(head, root.left) or self.isSubPath(head, root.right)
  • dfs 函数

    • dfs(s, t) 用于检查从树节点 t 开始,是否存在与链表 s 对应的子路径。
    • 终止条件
      • 如果链表的节点 sNone,说明链表已经完全匹配,返回 True
      • 如果树的节点 tNone 或节点值不匹配,返回 False
    • 递归调用:分别检查链表的下一个节点 s.next 是否能匹配树的左右子节点 t.leftt.right
  • 主函数

    • 如果链表为空,返回 True(空链表总能匹配成功)。
    • 如果树为空,返回 False(链表不为空时,空树无法匹配)。
    • 对树的每个节点进行检查:当前节点是否匹配,或者链表可以从左子树或右子树匹配。
;