第一版,整棵树的每个节点都检查下
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool isSubtree(TreeNode* root, TreeNode* subRoot) {
if(root == nullptr && subRoot == nullptr)
return true;
if(root == nullptr || subRoot == nullptr)
return false;
return isSame(root,subRoot) || isSubtree(root->right,subRoot) || isSubtree(root->left,subRoot);
}
bool isSame(TreeNode* root,TreeNode* subRoot){
if((root == nullptr && subRoot == nullptr))
return true;
if(root == nullptr || subRoot == nullptr||(root->val != subRoot->val))
return false;
return isSame(root->right,subRoot->right) || isSame(root->left,subRoot->left);
}
};
第二版,修改了两个地方,大体思路和查看是否是平衡二叉树的思路一样的。
1、将整棵树拆分成很多棵小树。看是需要1)只要有一棵小树符合条件,还是需要2)有每棵小树符合条件。
2、每一棵小树都检查一遍是否子叶是相同的。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool isSubtree(TreeNode* root, TreeNode* subRoot) {
if(root == nullptr && subRoot == nullptr)
return true;
// if(root == nullptr || subRoot == nullptr)
// return false;
//上面这一行的操作是不太对的,因为如果subRoot为空的话,也可以成为root的子树
if(root == nullptr && subRoot != nullptr)
return false;
return isSame(root,subRoot) || isSubtree(root->right,subRoot) || isSubtree(root->left,subRoot);
}
bool isSame(TreeNode* root,TreeNode* subRoot){
if((root == nullptr && subRoot == nullptr))
return true;
if(root == nullptr || subRoot == nullptr||(root->val != subRoot->val))
return false;
// return isSame(root->right,subRoot->right) || isSame(root->left,subRoot->left);
//上面的是或的关系是因为一棵树有众多子树只要有一棵树相同便可,下面是与的关系是因为每一棵树的子叶都要相同。
return isSame(root->right,subRoot->right) && isSame(root->left,subRoot->left);
}
};