101. Symmetric Tree

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree [1,2,2,3,4,4,3] is symmetric:
1
/
2 2
/ \ /
3 4 4 3

这题注意不能判断左右孩子的value是不是一致,那不是对称;而是要判断recursion(left.right, right.left) && recursion(left.left, right.right,所以要新开一个递归函数。

这递归里又有技巧。

重点1 :技巧

 if (left == null || right == null) return left == right;

这一行就抵了下面两行:

        if (left == null && right == null) return true;
        if (left == null || right == null) return false;

重点2:递归的终止条件应该是返回false(除非判断不需要递归了,否则不能阻止进入递归)

递归里的条件,应该是判断什么时候终止,也就是返回false。不能在进入递归之前就结束了。比如下面这句:

        if (left.val != right.val) return false;

我一开始写的是:

        if (left.val == right.val) return true;

这种的话遇到

[1,2,2,null,3,null,3]

这棵树就不行了,我想了半天没想通,只好debug了一下。。结果发现自己太蠢:如果写if (left.val == right.val) return true;,那走到第二层的时候直接就返回true了,根本没进入递归啊。所以递归的终止条件应该是返回false。不能在进入递归之前就结束了。

就是说,除非判断不需要递归了,否则不能阻止进入递归。
所以, if (left == null || right == null) return left == right;这种就没有问题,因为它不需要继续递归了。

    public boolean isSymmetric(TreeNode root) {
        if (root == null) return true;
        return recursion(root.left, root.right);
    }

    private boolean recursion(TreeNode left, TreeNode right) {
        if (left == null || right == null) return left == right;
        if (left.val != right.val) return false;
        return recursion(left.right, right.left) && recursion(left.left, right.right);
    }

刚直播覃超把代码修改了一下,他说if (left.val != right.val) return false;这种是不好的,但是直接return的话又不好因为后面还有一个return。
所以他改成了这样:

        return left.val == right.val && recursion(left.right, right.left) && recursion(left.left, right.right);

你可能感兴趣的:(101. Symmetric Tree)