一、题目
二、思路
- 解法一:只能说似曾相识,是前两道题的融合,一棵树如果对称,那我将他的左子树或者右子树翻转,再判断左右子树是否相等就结了;
- 解法二:其实没必要将树翻转,之前的代码是用A树的左子树和B树的左子树进行判断,这样判出来的是完全相等的两颗树,这里稍微转换下思想,用A树的左子树和B树的右子树进行判断(这里想一想,镜像不就是这个意思吗)即可;
三、解法
解法一
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
return equals(root.left, reverseTree(root.right));
}
private TreeNode reverseTree(TreeNode root) {
if (root == null) {
return root;
}
TreeNode tmp = root.left;
root.left = reverseTree(root.right);
root.right = reverseTree(tmp);
return root;
}
private boolean equals(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
} else if (p == null || q == null) {
return false;
} else if (p.val != q.val) {
return false;
}
return equals(p.left, q.left) && equals(p.right, q.right);
}
}
解法二
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
return isMirror(root.left, root.right);
}
private boolean isMirror(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
} else if (p == null || q == null) {
return false;
} else if (p.val != q.val) {
return false;
}
return isMirror(p.left, q.right) && isMirror(p.right, q.left);
}
}