本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、题目描述:
951. 翻转等价二叉树 - 力扣(LeetCode) (leetcode-cn.com)
我们可以为二叉树 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 的三个节点。
示例 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)