题目:
给你两棵二叉树 root
和 subRoot
。检验 root
中是否包含和 subRoot
具有相同结构和节点值的子树。如果存在,返回 true
;否则,返回 false
。
二叉树 tree
的一棵子树包括 tree
的某个节点和这个节点的所有后代节点。tree
也可以看做它自身的一棵子树。
思路:
左边的每一棵子树都跟右边的树比较一下。
1.先判断root是否为空,如果为空,则为false;
2.再写一个函数判断两个树是否都为空:
(1).若都为空,则返回true,若一个为空,另一个不为空,则返回false,
(2).如果都不为空:
<1>.若两个值不相等,则返回false;
<2>.若两个值相等,则分别比较他们的左子树和右子树的值(递归)。
3.如果以上两种都不成立,则递归root的左右子树,中间用逻辑或,因为你不知道在左子树还是在右子树上与之相同。
代码:
bool iaSameTree(struct TreeNode* p,struct TreeNode* q)
{
//都为空
if(p==NULL&&q==NULL)
{
return true;
}
//其中一个为空
if(p==NULL||q==NULL)
{
return false;
}
//都不为空
if(p->val!=q->val)
{
return false;
}
//p.q值相等,分别比较左子树和右子树
return iaSameTree(p->left,q->left)
&& iaSameTree(p->right,q->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {
if(root==NULL)
{
return false;
}
if(iaSameTree(root,subRoot))
{
return true;
}
return isSubtree(root->left,subRoot)
||isSubtree(root->right,subRoot);
}