输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:先序遍历A判定节点是否跟B的头结点相等;如果发现相等节点,就再次递归遍历相应A的子树是否包含B树;
bool equal(TreeNode* p1,TreeNode* p2)
{
//p1可能比p2复杂;
// if(p2==NULL) return true;
//bool res=true;
if(p1==NULL||(p1->val!=p2->val)) return false;
//if(p1!=NULL&&p2==NULL) return false;
bool resl=true,resr=true;
//不处理但有返回值
if(p2->left!=NULL)
{
resl=equal(p1->left,p2->left);
}
if(p2->right!=NULL)
{
resr=equal(p1->right,p2->right);
}
// if(p2!=NULL&&p1!=NULL)
return resl&&resr;
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
//
if(pRoot1==NULL||pRoot2==NULL) return false;
bool res=false;
if(pRoot1->val==pRoot2->val)
res=equal(pRoot1,pRoot2);
if(!res)
{
res=HasSubtree(pRoot1->left,pRoot2);
if(!res)
res=HasSubtree(pRoot1->right,pRoot2);
}
return res;
}