剑指 Offer 28. 对称的二叉树
题目:
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [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 9
示例1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例2:
输入:root = [1,2,2,null,3,null,3]
输出:false
解题思路:
对称二叉树定义: 对于树中 任意两个对称节点 left 和 right,一定有:
left.val = right.val:即此两对称节点值相等。
left.left.val = right.right.val:即 left 的 左子节点 和 right 的 右子节点对称;
left.right.val = right.left.val :即 left 的 右子节点 和 right 的 左子节点对称。
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
* 执行结果:通过
* 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
* 内存消耗:36.3 MB, 在所有 Java 提交中击败了65.67%的用户
* 通过测试用例:195 / 195
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
return root==null ? true : bet(root.left,root.right);
}
public boolean bet(TreeNode left,TreeNode right){
if(left==null && right==null) return true;
if(left==null ||right==null || left.val!=right.val) return false;
return bet(left.left,right.right) && bet(left.right,right.left);
}
}