定义:
子树:是只要包含了一个结点,就得包含这个结点下的所有节点。
子结构:包含了一个结点,可以只取左子树或者右子树,或者都不取。
判断一个二叉树是不是另一个二叉树子树的代码实现如下:
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1 == NULL || pRoot2 == NULL) return false;
return ( isSubtree(pRoot1,pRoot2)) || HasSubtree(pRoot1->left, pRoot2) || HasSubtree(pRoot1->right, pRoot2);
}
private:
bool isSubtree(TreeNode * r1, TreeNode * r2){
if(r2 == NULL && r1 == NULL) return true;//子树必须使得两个部分同时为NULL
else if(r1!=NULL && r2!=NULL)
{
if(r1->val != r2->val)
{
return false;
}
return isSubtree(r1->left, r2->left) && isSubtree(r1->right, r2->right);
}
else
return false;
}
};
判断一个二叉树是不是另一个二叉树子结构的代码实现如下:
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1 == NULL || pRoot2 == NULL) return false;
return ( isSubtree(pRoot1,pRoot2)) || HasSubtree(pRoot1->left, pRoot2) || HasSubtree(pRoot1->right, pRoot2);
}
private:
bool isSubtree(TreeNode * r1, TreeNode * r2){
if(r2 == NULL) return true;
if(r1 == NULL) return false;//r2非空,r1为空
if(r1->val != r2->val)
return false;
return isSubtree(r1->left, r2->left) && isSubtree(r1->right, r2->right);
}
};