前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指offer - 树的子结构 - JavaScript

剑指offer - 树的子结构 - JavaScript

作者头像
心谭博客
发布2020-04-21 15:23:02
6150
发布2020-04-21 15:23:02
举报
文章被收录于专栏:YuanXinYuanXin

题目描述:输入两棵二叉树 A,B,判断 B 是不是 A 的子结构。(ps:我们约定空树不是任意一个树的子结构)。

题目描述

输入两棵二叉树 A,B,判断 B 是不是 A 的子结构。(ps:我们约定空树不是任意一个树的子结构)。

解法 1: 递归法

为了方便说明,先看两个例子。

例子 1

下图是第一个例子,可以看到 B 是 A 的子结构。

第一个例子的判断逻辑是:

  • 比较当前节点值
  • 递归比较左右节点的值
  • 直到遍历完 B 树

例子 2

下图是第二个例子,可以看到 B 也是 A 的子结构。

但是 A 的根节点和 B 的根节点并不相同。因此对于这种情况,需要对 A 树进行递归遍历。如果 B 是 A 的左子树或者右子树的子结构,那么也是可以的。

代码实现

设计两个函数:

  • isSubStructure 的职能:判断 B 是否是 A 的子结构。是,返回 true;否则,尝试 A 的左右子树
  • isSubTree 的职能:封装“判断 B 是否是 A 的子结构”的具体逻辑。
代码语言:javascript
复制
// ac地址:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof/
// 原文地址:https://xxoo521.com/2020-01-13-subtree/

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} A
 * @param {TreeNode} B
 * @return {boolean}
 */
var isSubStructure = function(A, B) {
    // 题目约定:约定空树不是任意一个树的子结构
    if (!A || !B) {
        return false;
    }

    return (
        isSubTree(A, B) ||
        isSubStructure(A.left, B) ||
        isSubStructure(A.right, B)
    );
};

function isSubTree(pRoot1, pRoot2) {
    // B树遍历完了,说明B是A的子结构
    if (!pRoot2) {
        return true;
    }
    // A遍历完了,但是B还没有遍历完,那么B肯定不是A的子结构
    if (!pRoot1) {
        return false;
    }

    if (pRoot1.val !== pRoot2.val) {
        return false;
    }

    return (
        isSubTree(pRoot1.left, pRoot2.left) &&
        isSubTree(pRoot1.right, pRoot2.right)
    );
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 解法 1: 递归法
    • 例子 1
      • 例子 2
        • 代码实现
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档