zoukankan      html  css  js  c++  java
  • 剑指 Offer 26. 树的子结构(中等)

    通过率 46.4%

    题目链接

    题目描述:

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

    B是A的子结构, 即 A中有出现和B相同的结构和节点值。

    例如:
    给定的树 A:

         3
        /
       4   5
      /
     1   2

    给定的树 B:

       4 
      /
     1
    返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

    示例 1:

    输入:A = [1,2,3], B = [3,1]
    输出:false

    示例 2:

    输入:A = [3,4,5,1,2], B = [4,1]
    输出:true

    限制:

    0 <= 节点个数 <= 10000

    思路:

    这题没有明确的思路,然后看了Krahets大神的题解

    不能清楚地说出自己的理解的话,那这种逻辑思维就无法吸收为自己的,现在,要用我自己的话理一理思路(貌似没有大神的好懂...不过自己看看就好(#^.^#)):

    • 遍历A树的每个节点,判断以该节点为根节点的树是否包含B树(即调用函数isSubStructure)
    • 若该节点的val值等于B的根节点的val值,则递归判断以该节点为根节点的树是否能与B树匹配(调用函数sub)

    也就是说,每遍历一个节点,都调用isSubStructure(node.left/right, B);一旦遇到node.val === B.val的情况,就先调用sub(node, B),真正能判断A树中是否包含B树的其实是sub()函数

     1 /*JavaScript*/
     2 /**
     3  * Definition for a binary tree node.
     4  * function TreeNode(val) {
     5  *     this.val = val;
     6  *     this.left = this.right = null;
     7  * }
     8  */
     9 /**
    10  * @param {TreeNode} A
    11  * @param {TreeNode} B
    12  * @return {boolean}
    13  */
    14 var sub = function(x, y) {
    15     if(!y) return true //B树已走到叶子节点,说明x包含y
    16     if(!x || x.val !== y.val) return false //B未走到叶子节点而A已走到叶子节点 或者 值不等
    17     return sub(x.left, y.left) && sub(x.right, y.right) //值相等,则判断左右子树是否能匹配
    18 }
    19 
    20 var isSubStructure = function(A, B) {
    21     if(!A || !B) return false //A或B为空树
    22     return A.val === B.val && sub(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B)
    23 };
  • 相关阅读:
    Docker技术入门之---Docker核心概念:镜像、容器、仓库(2)
    Docker技术入门之---Docker安装(1)
    微信小程序自定义组件
    vue项目优化--使用CDN和Gzip
    小程序分包
    VUE--- browserHistory 和 hashHistory。
    vue-生成的css文件中背景url()图片路径问题
    vue异步组件
    Vue双向绑定原理及实现
    web-view小程序转发功能,web-view和小程序之间传参
  • 原文地址:https://www.cnblogs.com/wwqzbl/p/15148671.html
Copyright © 2011-2022 走看看