力扣-树的子结构

218 阅读1分钟

题链接:leetcode-cn.com/problems/sh…

解题分析:

此解法效率不高 题目要求找 B是否为A的子树节点,且不为空树节点,故我们判断A或者B为空直接返回false, 判断B是否为A的子树节点,采用递归解法,我们首先判断有几种情况

情况如下:

  1. A为空,B还有值 // 返回false
  2. B为空 // 说明已经找完了,并且没有出现A.val !== B.val 的情况,所以为true
  3. A.val !== B.val // false

从这几种情况分析, 我们递归整棵树,直到符合true或者false

function isSubStructure(A, B) {
    // 题目要求的约定空树不是任意一个树的子结构,也就是说A B两颗树中任一一颗是空树则返回false
    if (!A || !B) return false
    return someNode(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B)
}

function someNode(a, b) {
    // 一直找到子树b为空都没有发现a.val !== b.val的情况,那么就确定确实存在这颗子树了
    if (b ===null){
        return true
    }
    // 如果找到a没有节点可查了, b还有,必然不是a的子节点
    if (a ===null) {
        return false
    }
    // 如果值不同, 必然不是子节点
    if (a.val !== b.val){
        return false
    }
    // 查找整棵树
    return someNode(a.left, b.left) && someNode(a.right, b.right)
}