思路:
- 从head 链表深度找,知道使用深度优先遍历dfs
- 从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
对应的子路径。- 终止条件:
- 如果链表的节点
s
为None
,说明链表已经完全匹配,返回True
。 - 如果树的节点
t
为None
或节点值不匹配,返回False
。
- 如果链表的节点
- 递归调用:分别检查链表的下一个节点
s.next
是否能匹配树的左右子节点t.left
或t.right
。
-
主函数:
- 如果链表为空,返回
True
(空链表总能匹配成功)。 - 如果树为空,返回
False
(链表不为空时,空树无法匹配)。 - 对树的每个节点进行检查:当前节点是否匹配,或者链表可以从左子树或右子树匹配。
- 如果链表为空,返回