题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)。
解题思路
判断一棵树是不是另一棵树的子结构,并不是判断是不是另一棵树的子树。pRoot1树是原树,pRoot2树是待判断的树。在这里我们可以分两步进行。
外层函数实现:首先在pRoot1树中找到和pRoot2树根节点值相同的子树。
内层函数实现:在找到与pRoot2根节点值相同的子树之后,判断pRoot2是不是pRoot1的子结构。方法如下:
如果pRoot2为空树,则是;//题目中已经说了空树不是子结构,空树其实已经在外函数中被过滤掉了。在这里判断为是是因为此时已经判断出pRoot2不为空,有根节点,这里判断的其实是pRoot2的子树。也就是说当pRoot2子树为空的时候,pRoot2还是可能成为pRoot1的子结构的。
如果pRoot2不为空,但pRoot1为空,则不是子结构。
如果pRoot2的值不等于pRoot1的值,则不是子结构。
如果值相等,则继续判断左子树和右子树的情况。
代码实现
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool DoesTree1HasTree2(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(!pRoot2){return true;}
if(!pRoot1&&pRoot2){return false;}
if(pRoot1->val!=pRoot2->val){return false;}
return DoesTree1HasTree2(pRoot1->left,pRoot2->left)&&DoesTree1HasTree2(pRoot1->right,pRoot2->right);
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
bool result = false;
if (pRoot1 &&pRoot2 )
{
if (pRoot1->val == pRoot2->val) {
//继续判断树1是否有树2;
result = DoesTree1HasTree2(pRoot1, pRoot2);
}
if(!result){
result=HasSubtree(pRoot1->left,pRoot2);
}
if(!result){
result=HasSubtree(pRoot1->right,pRoot2);
}
}
return result;
}
};