一日一练: 树的子结构

161 阅读1分钟

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)。B是A的子结构, 即 A中有出现和B相同的结构和节点值。

思路

  1. 深度优先扫描二叉树A,找到值与B的根节点的值相同的节点
  2. 找到之后:利用验证函数,去比对此时A的左右子节点是否与B的左右子节点的值完全相同
    • 对比过程中只要出现不相同,表明当前B不为A的子结构
  3. 继续查找下一个与B的根节点的值相同的节点,继续验证是否是子结构
  4. 。。。
  5. 直到扫描完所以A的节点

代码

function isSubStructure(A, B) {
  if (B === null || A === null) return false
  function dfs(A, B) {
    // 找到A中值与B的根节点的值 相同的节点
    // 验证以此节点为根节点的子树是否与B子树值一一对应
    if (A.val === B.val && checkIsSameStructure(A, B)) {
      return true
    }
    return (A.left && dfs(A.left, B)) || (A.right && dfs(A.right, B)) || false
  }
  // 
  function checkIsSameStructure(A, B) {
    if (B === null) {
      return true
    } else if (A === null) {
      return false
    }
    // 值相同 继续比较
    // 其他情况 退出比较
    if (A.val === B.val) {
      return (
        checkIsSameStructure(A.left, B.left) &&
        checkIsSameStructure(A.right, B.right)
      )
    } else {
      return false
    }
  }
  return dfs(A, B)
}