Q:给定一个树A和树B,判断树B是否是树A的子结构(约定空树不是任何一个树的子结构)
解题思路:
- 用递归的思想
- 如果根节点相同,则继续判断左右节点是否相同
- 如果根节点不同,则递归判断左右节点及其子树
代码:
定义树的节点:
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(pRoot1&&pRoot2)
{
if(ispart(pRoot1,pRoot2))
return true;
if(ispart(pRoot1->left,pRoot2))
return true;
if(ispart(pRoot1->right,pRoot2))
return true;
}
return false;
}
bool ispart(TreeNode* pRoot1,TreeNode* pRoot2)
{
if(pRoot2==NULL)
return true;
if(pRoot1==NULL)
return false;
if(pRoot1->val==pRoot2->val)
return ispart(pRoot1->left,pRoot2->left)&&ispart(pRoot1->right,pRoot2->right);
else
return false;
}
};
注意:在ispart函数中判断节点是否为空时,要先判断pRoot2是否为空,如果为空则是子树,如果先判断pRoot1可能会导致结果出错