思路
1、递归
2、辅助函数
3、先找父节点的值相等的节点,进行IsPart判断;如果结果为false,那么对左右节点分别递归调用函数。
4、注意边界条件、递归终止条件
代码
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool IsPart(TreeNode* tree1, TreeNode* tree2){
if(tree2==nullptr){
return true;
}
if(tree1==nullptr){
return false;
}
if(tree1->val!=tree2->val){
return false;
}
return IsPart(tree1->left, tree2->left) && IsPart(tree1->right, tree2->right);
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
bool found = false;
/*
if(pRoot1!=nullptr && pRoot2!=nullptr){
if(pRoot1->val==pRoot2->val){
found = IsPart(pRoot1, pRoot2);
}
if(found==false){
found = HasSubtree(pRoot1->left, pRoot2);
}
if(found==false){
found = HasSubtree(pRoot1->right, pRoot2);
}
}
*/
if(pRoot1!=nullptr && pRoot2!=nullptr){
// if(!found){
// found = IsPart(pRoot1, pRoot2);
// }
// if(!found){
// found = IsPart(pRoot1->left, pRoot2);
// }
// if(!found){
// found = IsPart(pRoot1->right, pRoot2);
// }
if(pRoot1->val==pRoot2->val){
found = IsPart(pRoot1,pRoot2);
}
if(!found){
found = HasSubtree(pRoot1->left, pRoot2);
}
if(!found){
found = HasSubtree(pRoot1->right, pRoot2);
}
}
return found;
}
};

京公网安备 11010502036488号