LeetCode 剑指Offer 26 树的子结构

LeetCode 剑指Offer 26 树的子结构

题目

在这里插入图片描述

解题:深度优先搜索

相似题目:

题目解题
面试题 04.10. 检查子树面试题 04.10. 检查子树解题
剑指 Offer 26. 树的子结构剑指 Offer 26. 树的子结构解题

本题与 面试题 04.10 的区别在于:

  1. 面试题 04.10 约定空树是任意一个树的子树,而本题不是;
  2. 面试题 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. 检查子树解题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值