【刷题打卡】951. 翻转等价二叉树

114 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、题目描述:

951. 翻转等价二叉树 - 力扣(LeetCode) (leetcode-cn.com)

我们可以为二叉树 T 定义一个 翻转操作 ,如下所示:选择任意节点,然后交换它的左子树和右子树。

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

这些树由根节点 root1root2 给出。如果两个二叉树是否是翻转 等价 的函数,则返回 true ,否则返回 false

示例 1:

输入:root1 = [1,2,3,4,5,6,null,null,null,7,8], root2 = [1,3,2,null,6,4,5,null,null,null,null,8,7]
输出:true
解释:我们翻转值为 13 以及 5 的三个节点。

示例 2:

输入: root1 = [], root2 = []
输出: true

示例 3:

输入: root1 = [], root2 = [1]
输出: false

提示:

  • 每棵树节点数在 [0, 100] 范围内
  • 每棵树中的每个值都是唯一的、在 [0, 99] 范围内的整数

二、思路分析:

这个题需要注意一个地方,不能被题目中的图给迷惑了。

因为题目说的是经过若干次翻转后 可以得到完全对称,要你判断是否完全对称。

那如果不翻转呢,那不也是对称吗。

所以要分两种情况:1.翻转若干次至完全对称。2.不翻转维持原状,也是完全对称。

对于第一种情况:需要 左值=右值,右值=左值

对于第二种情况:需要 左值=左值,右值=右值

临界null的情况就不详细说了,比较容易,直接上代码。

三、AC 代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool flipEquiv(TreeNode* root1, TreeNode* root2) {
       if(root1 == NULL && root2 == NULL){
           return true;
       }
       if(root1 == NULL || root2 == NULL){
           return false;
       }
       if(root1->val != root2->val){
           return false;
       }
       return (flipEquiv(root1->left,root2->left) && flipEquiv(root1->right,root2->right))
           || (flipEquiv(root1->right,root2->left) && flipEquiv(root1->left,root2->right));
    }
};

范文参考:

究极无敌条件判断 逻辑极其清晰 能这样写出来的人也真的很牛批了 - 翻转等价二叉树 - 力扣(LeetCode) (leetcode-cn.com)