思路
(1)巧妙的思路在于将第三代的子树的左右子树重新定义了左右这个概念。
(2)判断false , return right==null;
(3)另参见 剑指Offer-树-面试题28:对称的二叉树
解法1
执行用时 :1 ms, 在所有 Java 提交中击败了54.54%的用户
内存消耗 :38.8 MB, 在所有 Java 提交中击败了6.60%的用户
class Solution {
public boolean isSymmetric(TreeNode root) {
// 左子树的 左子树 == 右子树的 右子树;
// 左子树的 右子树 == 右子树的 左子树;
if(root == null){
return true;
}
return isSymmetric(root.left, root.right);
}
boolean isSymmetric(TreeNode left , TreeNode right){
if(left == null){
return right==null;
}
if(right == null){
return false;
}
if(left.val != right.val){
return false;
}
return isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left);
}
}
解法2
时间复杂度:O(n), 空间复杂度O(n)
(1)在判断值相等的环节写法稍稍不同。
执行用时 :0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗 :38.1 MB, 在所有 Java 提交中击败了12.15%的用户
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null){
return true;
}
return dfs(root.left, root.right);
}
boolean dfs(TreeNode node1,TreeNode node2){
// if(node1 == node2){
// return true;
// }else{
// return false;
// }
if(node1 == null && node2 == null){
return true;
}
if(node1 == null || node2 ==null){
return false;
}
return (node1.val == node2.val) && dfs(node1.left, node2.right) && dfs(node1.right, node2.left);
}
}