题目:572. 另一棵树的子树
思路:对于二叉树root,只要当前的值等于二叉树subRoot的值,我们就可以使用深度优先搜索dfs2进行比对。比对成功直接输出true,失败的话,就用二叉树root的左右子树再与二叉树subRoot进行比对。直到比对成功,或当前的二叉树root为nullptr,即失败。细节看注释
/**
* 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 dfs2(TreeNode* root, TreeNode* subRoot){
//如果当前的状态均为nullptr,即比对成功;如果其中一个是nullptr,比对失败
if(root==nullptr&&subRoot==nullptr) return true;
else if(root==nullptr||subRoot==nullptr) return false;
//判断是否为nullptr,就是避免指针越界
//当前值不相等,返回false
if(root->val!=subRoot->val) return false;
//左右子树都比对成功,返回true
if(dfs2(root->left,subRoot->left)&&dfs2(root->right,subRoot->right)) return true;
return false;
}
bool dfs1(TreeNode* root, TreeNode* subRoot){
//当前的二叉树root为nullptr,即失败
if(root==nullptr) return false;
//当前二叉树root的值等于二叉树subRoot的值
bool flag=0;
if(root->val==subRoot->val){
//使用深度优先搜索dfs2进行比对
flag=dfs2(root,subRoot);
}
//比对成功直接输出true
if(flag) return true;
//失败的话,就用二叉树root的左右子树再与二叉树subRoot进行比对
return dfs1(root->left,subRoot)||dfs1(root->right,subRoot);
}
bool isSubtree(TreeNode* root, TreeNode* subRoot) {
return dfs1(root,subRoot);
}
};