剑指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);
}
我不管,JS天下第一