Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode>对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ \
2 2
/ \
3 3
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
限制:
0 <= 节点个数 <= 1000
二、思路分析:
思路一:
- 基本判断:root == null 返回true ,否则就进递归
- 如果左右子树都为空直接返回true,说明到底结束了
- 如果左右子树有一个为空,另一个不为空,或者是左右子树都不为空,但是他们的值不相同,返回false
- 判断 左右子树是否是镜像也相同的。我们知道,镜像相同说明,(root.left.left == root.right.right) && (root.left.right == root.right.left)
思路二:
- 利用翻转二叉树的方法与原二叉树比较,最开始始终返回true
- 翻转时改变了原来二叉树的结构,导致比较时始终传入的都是相同的两棵树
- 在翻转时创建一个新的树,而不是原地修改旧树,将新的翻转后的树与原树比较即可
三、AC代码:
思路一:
class Solution {
public boolean isSymmetric(TreeNode root) {
return root == null ? true : isSymm(root.left, root.right);
}
boolean isSymm(TreeNode firstNode, TreeNode secondNode) {
if (firstNode == null && secondNode == null) return true;
if (firstNode == null || secondNode == null || firstNode.val != secondNode.val) return false;
return isSymm(firstNode.left, secondNode.right) && isSymm(firstNode.right, secondNode.left);
}
}
思路二:
class Solution {
public boolean isSymmetric(TreeNode root) {
TreeNode tmpNode = root;
TreeNode rootNode2 = mirror(tmpNode);
return isEquals(rootNode2, root);
}
private TreeNode mirror(TreeNode root) {
if (root == null) {
return null;
}
TreeNode newRoot = new TreeNode(root.val);
TreeNode tmpNode = root.left;
newRoot.left = mirror(root.right);
newRoot.right = mirror(tmpNode);
return newRoot;
}
private boolean isEquals(TreeNode rootNode1, TreeNode rootNode2) {
if (rootNode1 == null && rootNode2 == null) return true;
if (rootNode1 == null || rootNode2 == null) return false;
return rootNode1.val == rootNode2.val && isEquals(rootNode1.left, rootNode2.left)
&& isEquals(rootNode1.right, rootNode2.right);
}
}