问题描述:
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [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
解题思路:
对称二叉树规律:对于树中任意两个对称节点 LL和 R ,一定有:
- L.val =R.val :即此两对称节点值相等。
- L.left.val = R.right.val :即 L 的 左子节点 和 R 的 右子节点 对称;
- L.right.val = R.left.valL:即 L 的 右子节点 和 R 的 左子节点对称。
根据以上规律,从顶至底递归,判断每对节点是否对称,从而判断树是否为对称二叉树。
代码实现:
public class t28对称的二叉树 {
public boolean isSymmetric(TreeNode root) {
//如果根节点为空,则返回true
return root==null ? true:judge(root.left, root.right);
}
private boolean judge(TreeNode left, TreeNode right) {
if(left==null && right==null) return true;
//当只有其中一个为空或者两个节点的值不相等时,返回false
if(left==null || right==null || left.val!=right.val) return false;
return judge(left.right, right.left) && judge(left.left, right.right);
}
}
提交结果: