题目
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
题解
运用递归的思想,二叉树的左树应该等于右树,那么就是对称的。如果左边的和右边的都为空,那么为true,其中一个为空,另一个不为空则为false,如果两边值不相等,那么也不对称,值相等就继续递归比较,直到子树节点都为null,代表遍历结束了。
AC代码
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {boolean}
*/
var isSymmetric = function(root) {
return isMirror(root, root);
};
function isMirror(t1, t2) {
if (t1 == null && t2 == null) return true;
if (t1 == null || t2 == null) return false;
if (t1.val === t2.val) {
return isMirror(t1.left, t2.right) && isMirror(t1.right, t2.left);
}
return false;
}
总结
其实就是左右树分别遍历比较,运用递归的思想来实现遍历。要知道如何比较算对称,这点是核心思想。就是左右值相等,并且对应下的子树挨个遍历,知道找到子节点都是null,说明遍历完毕了,在这个遍历的过程中都没有出现值不相等或者节点一个为空一个不为空的情况,那最后就证明是对称的。