vlambda博客
学习文章列表

每日一题-翻转等价二叉树

2022.4.18

951. 翻转等价二叉树


我们可以为二叉树 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
解释:我们翻转值为 1,3 以及 5 的三个节点。

题解:

关于翻转,父子关系之类的题目,优先考虑递归解法,递归时考虑转化为一般化的问题,对于某个节点,满足题目定义的翻转等价,一般有三种情况,1.两个节点都是空,2.两个节点的左右孩子对应相等,3.两个节点的左右孩子翻转相等,如果仅有一个为空或者两个节点值不同,返回false

class Solution {
   public boolean flipEquiv(TreeNode root1, TreeNode root2) {
       // 1.两个节点都是空
       if (root1 == null && root2 == null)
           return true;
       // 两个节点的左右孩子翻转相等,如果仅有一个为空或者两个节点值不同,返回false
       if (root1 == null || root2 == null || root1.val != root2.val)
           return false;
// 2.两个节点的左右孩子对应相等,3.两个节点的左右孩子翻转相等
       return (flipEquiv(root1.left, root2.left) && flipEquiv(root1.right, root2.right) ||
               flipEquiv(root1.left, root2.right) && flipEquiv(root1.right, root2.left));
  }
}