题目
解题:深度优先搜索
相似题目:
题目 | 解题 |
---|---|
面试题 04.10. 检查子树 | 面试题 04.10. 检查子树解题 |
剑指 Offer 26. 树的子结构 | 剑指 Offer 26. 树的子结构解题 |
本题与 面试题 04.10 的区别在于:
- 面试题 04.10 约定空树是任意一个树的子树,而本题不是;
- 面试题 04.10 规定 B 必须和 A 的某棵子树 完全相同 时返回 true;而本题是包含关系,A 中某棵树只要包含了 B 的结构和节点值就可以。举个例子:A=[10,12,6,8,3,11],B=[10,12,6,8],在面试题 04.10 中返回的是 false,本题返回的是 true。
// javascript
var isSubStructure = function(A, B) {
// 如果 B 是 null,空子树不是任意一个树的子结构
// 如果 A 是 null,代表没有找到能包含 B 的子树
if (A === null || B === null) return false;
// 如果根节点值相同,调用 hasSameStructure,来判断当前 A 是不是有 B 相同的结构和节点值(是包含关系)
// hasSameStructure 如果返回 true,说明找到啦
if (A.val === B.val && hasSameStructure(A, B)) return true;
// 否则,继续去子树里寻找
return isSubStructure(A.left, B) || isSubStructure(A.right, B);
};
const hasSameStructure = function(A, B) {
// 如果 B 为 null,说明 B 中所有节点遍历完毕,无论 A 是否为空,可以确定 A 包含 B
if (B === null) return true;
// B 不为 null,而 A 为 null,说明 A 没有 B 中的某些节点,包含关系不成立,返回 false
if (A === null) return false;
// 判断根节点,再去依次比较子树
return A.val === B.val && hasSameStructure(A.left, B.left) && hasSameStructure(A.right, B.right);
};
复杂度的讨论见:面试题 04.10. 检查子树解题