021.二叉树匹配问题续

对称二叉树

题目链接

leetcode 101

题意

给你一个二叉树的根节点 root , 检查它是否轴对称

思路

判断两颗树是否相等,我们递归检查它们的左子树,右子树是否对应相等

    bool isSameTree(TreeNode* p, TreeNode* q) {
        if(p==nullptr&&q==nullptr)return 1;
        if(p==nullptr||q==nullptr)return 0;
        if(p->val!=q->val)return 0;
        return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
    }

现在要判断是否对称

我们只需交叉判断左右子树即可

    bool isSymmetric(TreeNode* root) {
        return dfs(root->left,root->right);
    }
    bool dfs(TreeNode*l,TreeNode*r){
        if(l==nullptr&&r==nullptr)return 1;
        if(l==nullptr||r==nullptr)return 0;
        if(l->val!=r->val)return 0;
        return dfs(l->right,r->left)&&dfs(l->left,r->right);//交叉
    }

翻转等价二叉树

题目链接

leetcode 951

题意

我们可以为二叉树 T 定义一个 翻转操作 :

选择任意节点,然后交换它的左子树和右子树

只要经过一定次数的翻转操作后,能使 X 等于 Y,我们就称二叉树 X 翻转 等价 于二叉树 Y。

判断两棵树是否翻转等价

思路

暴力穷举在每个点处是否翻转

也就是同时判断 翻转不翻转 两种情况,任一匹配即可

    bool flipEquiv(TreeNode* root1, TreeNode* root2) {
        if(root1==nullptr&&root2==nullptr)return 1;
        if(root1==nullptr||root2==nullptr)return 0;
        if(root1->val!=root2->val)return 0;
        return 
        (flipEquiv(root1->left,root2->right)&&flipEquiv(root1->right,root2->left))
        ||
        (flipEquiv(root1->left,root2->left)&&flipEquiv(root1->right,root2->right));
    }
posted @ 2025-12-24 10:49  射杀百头  阅读(6)  评论(0)    收藏  举报