Loading

剑指offer[17]——树的子结构

题目描述

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

这里要注意子树子结构的概念,题目中所说的子结构是说只要B是A的一部分就可以。

这道题我们只需要遍历A树,找到与B树的根节点val值相等的子节点,然后再判断该子节点下的子结构是否包含B树。

以上图为例,我们遍历A树的时候找到其根节点的右子树根节点Cval值与B树根节点val值相等,于是我们就做进一步判断,节点C的左子树根节点val值与B树根节点左子树根节点val值相等,同时,节点C的右子树根节点val值与B树根节点右子树根节点val值相等,由于B树接下来已经没有节点,于是我们判断,B树是A树的子结构。

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function HasSubtree(pRoot1, pRoot2)
{
    // 判空操作
    if(!pRoot1 || !pRoot2){return false;}
    // 寻找与B树的根节点val值相等的子节点
    function isEqual(root1, root2){
        if(!root2){return true;}
        if(root1 && root1.val == root2.val){
            return isEqual(root1.left, root2.left) && isEqual(root1.right, root2.right);
        }else{
            return false;
        }
    }
    // 判断寻找到的子节点下的子结构是否包含B树
    function isContain(root){
        if(!root){return false;}
        if(root.val == pRoot2.val && isEqual(root, pRoot2)){return true;}
        return isContain(root.left)||isContain(root.right);
    }
    return isContain(pRoot1);
}
posted @ 2020-03-12 14:43  Jacob是我了  阅读(88)  评论(0编辑  收藏  举报