0x00 题目
给你一棵以 root
为根的二叉树
和一个 head
为第一个节点的链表
如果在二叉树中,存在一条一直向下
的路径
且每个点
的数值恰好一一对应以 head
为首的
链表中每个节点的值,那么请你返回 True
,否则返回 False
一直向下的路径的意思是:
从树中某个节点开始,一直连续向下的路径
0x01 思路
枚举二叉树中的每个
节点
为起点
往下的路径
是否有与链表相匹配
的路径
0x02 解法
语言:Swift
树节点:TreeNode
public class TreeNode {
public var val: Int
public var left: TreeNode?
public var right: TreeNode?
public init() { self.val = 0; self.left = nil; self.right = nil; }
public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
self.val = val
self.left = left
self.right = right
}
}
解法:
func isSubPath(_ head: ListNode?, _ root: TreeNode?) -> Bool {
func dfs(_ head: ListNode?, _ root: TreeNode?) -> Bool {
// 链表已经全部匹配完
if head == nil { return true }
// 二叉树访问到了空节点
if root == nil { return false }
// 值不相等
if head!.val != root!.val { return false }
// 值相等,继续递归匹配
return dfs(head!.next, root!.left) || dfs(head!.next, root!.right)
}
guard let root = root else { return false }
// 判断根节点
let b1 = dfs(head, root)
// 判断子节点
let b2 = isSubPath(head, root.left)
let b3 = isSubPath(head, root.right)
return b1 || b2 || b3
}
0x03 我的小作品
欢迎体验我的作品之一:小五笔 86 版
五笔学习好帮手!
App Store
搜索即可~