示例1
输入:
{8,8,7,9,2,#,#,#,#,4,7},{8,9,2}
返回值:
true
示例2
输入:
{1,2,3,4,5},{2,4}
返回值:
true
示例3
输入:
{1,2,3},{3,1}
复制
返回值:
false
解题思路
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot1 TreeNode类
* @param pRoot2 TreeNode类
* @return bool布尔型
*/
//记录最终结果
bool flag = false;
bool check(struct TreeNode* node, struct TreeNode* root ) {
//如何A树当前节点和B树当前节点存在且值不同,或者A树当前节点存在,但是B树当前节点不存在,匹配失败
if (node && root && node->val != root->val || !node && root)return false;
bool flag = true;
if (root->left) {
flag = flag && check(node->left, root->left);
}
if (root->right) {
flag = flag && check(node->right, root->right);
}
return flag;
}
void f(struct TreeNode* pRoot1, struct TreeNode* pRoot2 ) {
if (!pRoot1)return;
//用A树某个子树和B树匹配
flag = flag || check(pRoot1, pRoot2);
//匹配成功则不需要继续匹配
if (flag)return;
if (pRoot1->left) {
f(pRoot1->left, pRoot2);
}
if (pRoot1->right) {
f(pRoot1->right, pRoot2);
}
}
bool HasSubtree(struct TreeNode* pRoot1, struct TreeNode* pRoot2 ) {
// write code here
if (!pRoot1 || !pRoot2)return false;
f(pRoot1, pRoot2);
return flag;
}