每日一题-翻转等价二叉树
2022.4.18
951. 翻转等价二叉树
我们可以为二叉树 T 定义一个 翻转操作 ,如下所示:选择任意节点,然后交换它的左子树和右子树。
只要经过一定次数的翻转操作后,能使 X 等于 Y,我们就称二叉树 X 翻转 等价 于二叉树 Y。
这些树由根节点 root1
和 root2
给出。如果两个二叉树是否是翻转 等价 的函数,则返回 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));
}
}