题目
思路
这道题目的关键在于使用双迭代结构
在当前节点进行判断,是否符合子结构
若符合:返回true
若不符合:对当前节点的左右子树分别再次进行判断,若存在符合,返回true,否则继续迭代
双迭代:1、判断是否符合子结构
2、遍历整个A树
对于判断是否是子结构:
if 当前根节点不等,直接返回false
else 当前根节点相等,判断左右子树
返回:left and right
代码
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
if(!pRoot2||!pRoot1)//任何一个为空,则为false
return false;
else//当前均不空
{
if(son(pRoot1,pRoot2))//当前根节点即为子结构
return true;
if(HasSubtree(pRoot1->left,pRoot2)||HasSubtree(pRoot1->right,pRoot2))//迭代左右子树
return true;
else
return false;
}
}
//判断当前节点有没有子结构
bool son(TreeNode * root,TreeNode*index)
{
bool left=true,right=true;
if(!root||root->val!=index->val)//当前节点不等
return false;
//对左右分别迭代
if(index->left)
left=son(root->left,index->left);
if(index->right)
right=son(root->right,index->right);
return left and right;
}
};