思路
先序遍历树 A,判断树 A 中的每个节点x 为根的子树是否包含树 B。
上面这句话包含两个步骤:
- 先序遍历树 A 的每个节点
- 判断以树 A 的每个节点为根节点的子树是否包含 树 B
解法:
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
return (A != null && B != null) && (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B));
}
// 判断 B 是否为树 A 的子树
boolean recur(TreeNode A, TreeNode B) {
// B 已经匹配完,说明 B 是
if(B == null) return true;
// 树 A 已经走完或者值不相等,则不是子树
if(A == null || A.val != B.val) return false
// 递归对比当前树的左子树和右子树
return recur(A.left, B.left) && recur(A.right, B.right);
}
}
时间复杂度
参考:
- https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof/solution/mian-shi-ti-26-shu-de-zi-jie-gou-xian-xu-bian-li-p/
- https://mp.weixin.qq.com/s/LJbpo49qppIeRs-FbgjsSQ
- https://blog.algomooc.com/026.html#%E4%B8%89%E3%80%81%E5%8F%82%E8%80%83%E4%BB%A3%E7%A0%81