leetcode-华为专题-572. 另一棵树的子树_重复元素

leetcode-华为专题-572. 另一棵树的子树_程序_02

 

/**
 * 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==NULL||subRoot==NULL)
            return false;
        if(root->val!=subRoot->val){
            return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
        }else{
            // return judge(root,subRoot);
            return judge(root,subRoot)||isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);  // 这是为了应对出现有重复元素出现的情况,比如root: 1 1, subroot:1
        }
        return false;
    }
    bool judge(TreeNode* root1, TreeNode* root2){
        // 这是用来判断子树的
        if(root1==NULL&&root2==NULL)  // 两个都为空,说明比对完了,返回true
            return true;
        if(root1==NULL||root2==NULL)  // 其中一个为空,说明一个比完,一个还有,返回false
            return false;
        // 如果是判断子结构的就用下面这种方式
        // if(root2==NULL)
        //     return true;
        // if(root1==NULL)  // 此时肯定root2不为null,root1为null,所以false;
        //     return false;
        if(root1->val!=root2->val)
            return false;
        else 
            return judge(root1->left,root2->left)&&judge(root1->right, root2->right);
    }
};