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);复制代码