输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
3
/ \
4 5
/ \
1 2
给定的树 B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/shu-de-zi-jie-gou-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例 1:
输入:A = [1,2,3], B = [3,1]
输出:false
示例 2:
输入:A = [3,4,5,1,2], B = [4,1]
输出:true
限制:
- 0 <= 节点个数 <= 10000
解题思路:递归
func isSubStructure(A *TreeNode, B *TreeNode) bool {
if A == nil || B == nil {
return false
}
return isContain(A, B) || isSubStructure(A.Left, B) || isSubStructure(A.Right, B)
}
func isContain(A *TreeNode, B *TreeNode) bool {
if B == nil {
return true
}
if A == nil || A.Val != B.Val {
return false
}
return isContain(A.Left, B.Left) && isContain(A.Right, B.Right)
}
执行用时:16 ms, 在所有 Go 提交中击败了96.09%的用户
内存消耗:6.8 MB, 在所有 Go 提交中击败了84.56%的用户
复杂度分析:
- 时间复杂度:A、B 中的每一个元素在递归中都会被遍历一遍,因此,算法的时间复杂度为 O(N)。
- 空间复杂度:当 A、B 的数据结构都退化为链表时,递归调用深度最大。递归会一直执行,直到条件不满足,此时,算法的空间复杂度为 O(N)。
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/shu-de-zi-jie-gou-lcof
网友评论