输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
/*
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)
{
bool res=false;
if(pRoot1==NULL || pRoot2==NULL) //若输入的树有一个为空,则不满足要求
return res;
if(pRoot1->val==pRoot2->val) //若当前节点值相等,则以当前节点向下继续查找
{
res=doesHasSubStree(pRoot1,pRoot2);
}
if(!res) //若以当前节点为根节点查找不到子树,那么以左子树往下查找
{
res=doesHasSubStree(pRoot1->left,pRoot2);
}
if(!res) //若左子树也不满足,那么再查找右子树
{
res=doesHasSubStree(pRoot1->right,pRoot2);
}
return res;
}
bool doesHasSubStree(TreeNode* p1,TreeNode* p2) //用于判断是否含有子树
{
if(p2==NULL) //若要查找的子树已经查找到末节点,成功查找到子树
{
return true;
}
if(p1==NULL) //若待查找的树到达末端节点,已经遍历完
{
return false;
}
if(p1->val!=p2->val) //当前节点值不等,返回false
{
return false;
}
return doesHasSubStree(p1->left,p2->left) && doesHasSubStree(p1->right,p2->right); //如果根节点对应的上,那么就分别去子节点里面匹配
}
};