1367. 二叉树中的列表
原始题目链接:https://leetcode-cn.com/problems/linked-list-in-binary-tree/
给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表。
如果在二叉树中,存在一条一直向下的路径,且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值,那么请你返回 True ,否则返回 False 。
一直向下的路径的意思是:从树中某个节点开始,一直连续向下的路径。
解题思路:
这道题使用枚举法去求解,枚举法的时间复杂度在最坏的情况下是比较高的,需要注意的是,题目中没有要求二叉树中的节点一定是连续的,只要求一定是向下的。树的这种查找的题目,而且要求是向下的,自然会想到使用深度优先遍历,所以定义一个深度优先遍历的函数,用于在二叉树查找链表中的节点。还有一点需要注意的是,一定是要先判断链表是否都遍历完,再判断二叉树是否都遍历完,否则有的case不通过,这道题还是需要好好仔细想一想,具体实现看代码及注释。
代码实现
# 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 dfs(self, head: ListNode, root: TreeNode) -> bool:
# 链表遍历完了,则表示节点都找到了,则返回True
if not head:
return True
# 二叉树都遍历完了还没找完链表中的节点,则返回False
if not root:
return False
# 如果在二叉树中节点的值和链表中节点的值不相等,则直接返回False
if root.val != head.val:
return False
# 继续查找二叉树下面路径的值和链表中下个节点的值
return self.dfs(head.next, root.left) or self.dfs(head.next, root.right)
def isSubPath(self, head: ListNode, root: TreeNode) -> bool:
if not root:
return False
# 如果从当前根节点出发开始查找满足则直接返回True,否则从左子树或者右子树继续查找
return self.dfs(head, root) or self.isSubPath(head, root.left) or self.isSubPath(head, root.right)
参考文献:
https://leetcode-cn.com/problems/linked-list-in-binary-tree/solution/er-cha-shu-zhong-de-lie-biao-by-leetcode-solution/