剑指 Offer(19)——树的子结构

99 阅读2分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

题目 输入两棵二叉树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 思路 树的子结构 如果一个二叉树B是二叉树A的子结构,那么这要B这个结构在A中出现就可以。

数的子树 如果一个二叉树B是二叉树A的子树,那么二叉树B必是A的某个节点的左子树或者右子树或者就是二叉树A本身。

可以看出子树是要比子结构更加严格的,如果B是A的子树那必定是A的子结构,反之则不然。

代码

/**
 * 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) {
    //首先判断B是否为空树,返回false 判断A也是否为空树,以及递归后A是否为空树(在A上面找B的根节找不到)
    if(A === null || B === null) return false
    //假如B的根节点在A上找到了
    if(A.val==B.val){
        //findWay判断A左子树(右子数)是否包含或等于B左子树(右子数)
        var ifNotTrue=findWay(A.left,B.left)&&findWay(A.right,B.right)
        //都包含 就在递归中抛出函数返回值
        if(ifNotTrue==true) return true;
    }
    var ifAllTrue=isSubStructure(A.left,B)||isSubStructure(A.right,B);
    return ifAllTrue;
}
var findWay=function(x,y){
    //如果A子树为空 B子树还在返回false
    if(x === null&&y !== null) return false
    //包含A子树为空,B子树为空和A子树不为空,B子树为空
    if(y === null) return true
    //相等的话继续查找下一级子树
    if(x.val === y.val) {
        var ifTrue = findWay(x.left,y.left)&&findWay(x.right,y.right)
    } else {
        return false
    }
    return ifTrue
}