题目链接
给定一棵二叉树
给定一个链表
问是否能按照某种访问顺序使得该访问顺序与链表完全相等
上述访问顺序遵循以下规则
- 访问树节点
- 访问树的左孩子或右孩子
先序检查每个二叉树节点
检查即检查以该节点为头,子节点序列是否存在与链表相等的序列
若树有N个节点,链表有M个节点
时间复杂度
O(M * N)
func isSubPath(head *ListNode, root *TreeNode) (ans bool) {
ans = false
var search func(treeNode *TreeNode, listNode *ListNode)
search = func(treeNode *TreeNode, listNode *ListNode) {
if ans {
return
}
if listNode == nil {
ans = true
return
}
if treeNode == nil {
return
}
if treeNode.Val == listNode.Val {
search(treeNode.Left, listNode.Next)
search(treeNode.Right, listNode.Next)
}
}
var dfs func(treeNode *TreeNode)
dfs = func(treeNode *TreeNode) {
if ans || treeNode == nil {
return
}
search(treeNode, head)
dfs(treeNode.Left)
dfs(treeNode.Right)
}
dfs(root)
return
}